2010-08-09 1 views
0

У меня есть модель данных, как следующее:Создание запроса более эффективный для чтения

username | product1 | product2 
------------------------------- 
harold  abc  qrs 
harold  abc  def 
harold  def  abc 
kim  abc  def 
kim  lmn  qrs  
... 

username | friend_username 
--------------------------- 
john  harold 
john  kim 
... 

Я хочу построить гистограмму наиболее часто product1 к product2 записям существует, ограниченную для данных Product1 идентификатора, и ограничился только друзьями Джона. Так что-то вроде:

Что делать друг джон ссылки для product1, когда product1 = «а»: Выберите все друзьям Джонса из таблицы друзей. Для каждого друга, считать и группа количество записей, где product1 = «ABC», сортировать результаты в порядке по убыванию:

Results: 
abc -> def (2 instances) 
abc -> qrs (1 instance) 

Я знаю, что мы можем сделать следующее в реляционной базе данных, но будут некоторые порог, где этот вид запроса начнет использовать много ресурсов. У пользователей может быть большое количество записей друзей (500+). Если этот запрос выполняется 5 раз каждый раз, когда пользователь загружает страницу, я беспокоюсь, что быстро закончится ресурс.

Есть ли какая-нибудь другая таблица, которую я могу представить своей модели, чтобы облегчить накладные расходы на выполнение вышеуказанного запроса каждый раз, когда пользователи хотят увидеть гистограмму? Все, что я могу придумать, - это прекомпопировать гистограммы, когда это возможно, чтобы оптимизировать чтение.

Спасибо за любые идеи

ответ

0

Вот ваш запрос:

SELECT p.product2, 
     COUNT(p.product2) AS num_product 
    FROM PRODUCTS p 
    JOIN FRIENDS f ON f.friend_username = p.username 
        AND f.username = 'john' 
    WHERE p.product1 = 'abc' 
GROUP BY p.product2 
ORDER BY num_product DESC 

Для обработки 5 продуктов, использование:

SELECT p.product1, 
     p.product2, 
     COUNT(p.product2) AS num_product 
    FROM PRODUCTS p 
    JOIN FRIENDS f ON f.friend_username = p.username 
        AND f.username = 'john' 
    WHERE p.product1 IN ('abc', 'def', 'ghi', 'jkl', 'mno') 
GROUP BY p.product1, p.product2 
ORDER BY num_product DESC 

Это довольно просто, и тем больше вы можете фильтровать записи вниз , тем быстрее он будет работать из-за меньшего набора данных.

Если этот запрос выполняется 5 раз каждый раз, когда пользователь загружает страницу, я беспокоюсь, что быстро закончится ресурс.

Мой первый вопрос: почему вы запустили этот запрос более одного раза на страницу. Если он предназначен для покрытия нескольких друзей, запрос, который я опубликовал, может быть обновлен, чтобы показывать количество товаров для каждого пользователя или пользователя.

После этого мне было бы интересно, может ли запрос вообще кэшироваться. Насколько свежий вам действительно нужны данные - приемлемо ли 2 часа? Как насчет 6 или 12 ... Мы бы все как данные были мгновенными, но вам нужно взвесить это против производительности и принять решение.

+0

Привет, да, я бы хотел показать страницу с 5 продуктами, например. Затем вышеуказанный запрос нужно будет запускать один раз для каждого продукта, чтобы узнать гистограмму для каждого продукта. Согласились, что данные не должны быть действительно свежими. Было действительно интересно, не хватает ли я какой-то очевидной стратегии для оптимизации запроса. Я не думаю, что есть, в конце концов, вам нужно проверить N друзей против записей M product1 и сгруппировать их для построения гистограммы. Поэтому нам нужны стратегии для предотвращения запуска такого запроса или сокращения его в первую очередь. – user291701

+0

@ user291701: Я обновил ответ, чтобы включить как запрос для 5 продуктов одновременно. Я добавил 'product1' к выходу, чтобы вы знали, какое значение & count продукта product2 связано с значением' product1'. –

+0

Благодарим вас за помощь. – user291701

Смежные вопросы