Требуются консультации по предложению фильтрации категорий / результатов поиска с минимальными запросами к базе данных. - PullRequest
2 голосов
/ 22 мая 2011

Я работаю в интернет-магазине и нуждаюсь в совете по поводу лучшего подхода к сбору данных, чтобы показать варианты фильтрации по цене, бесплатной доставке и другим вариантам, в которых участвует подсчет базы данных. Мой скрипт написан на PHP на mySQL.

Если вы посмотрите на категории продуктов Amazon (то есть http://www.amazon.com/gp/search/ref=sr_nr_scat_14219011_ln?rh=n%3A14219011%2Ck%3Awii&keywords=wii&ie=UTF8), то увидите, что рядом с параметрами фильтрации на левой боковой панели указано количество результатов в каждой категории. Например, в Nintendo 163 совпадения.

Я не думаю, что это хранится в таблице, поскольку существует так много переменных, которые вы постоянно обновляете базу данных, но также кажется нецелесообразным запускать запрос для каждой группы фильтрации с настройкой 5-6 запросов на загрузку страницы. ,

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

Ответы [ 2 ]

1 голос
/ 22 мая 2011

Я не представляю, что это хранится в таблице, поскольку существует так много переменных, которые вы постоянно обновляете базу данных, но также кажется нецелесообразным запускать запрос для каждой группы фильтрации с тактом 5-6.запросов на загрузку страницы.

Это на самом деле практично.SQL рассчитывает на небольшие наборы данных (несколько сотен) очень быстро, если вы можете достичь их с помощью индексов.(Но см. Ниже, потому что действительно лучше не делать их.)

Было бы логичнее получить большой набор данных в кеше, использовать PHP для фильтрации результатов, а затем просто отобразить обратнорезультатов мало или запрос потенциально тысяч элементов хуже, чем выполнение нескольких запросов вторичного подсчета?

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

Есть ли другое решение?

Да.Следует использовать Memcache, чтобы избежать повторного выполнения запросов:

http://php.net/manual/en/book.memcached.php

1 голос
/ 22 мая 2011
SELECT COUNT(*) cnt, category FROM table WHERE category IN() GROUP BY category
...