Оптимизация запросов MySQL с оператором IN - PullRequest
0 голосов
/ 09 марта 2010

У меня есть база данных MySQL с довольно большой таблицей, в которой находятся продукты. Каждый из них имеет свой собственный идентификатор и поле categoryId, где есть идентификатор категории, принадлежащий этому продукту. Теперь у меня есть запрос, который вытаскивает продукты из указанных категорий, таких как:

SELECT * FROM products WHERE categoryId IN ( 1, 2, 3, 4, 5, 34, 6, 7, 8, 9, 10, 11, 12 )

Конечно, приходят предложение WHERE и сортировка ORDER BY, но не в этой вещи. Допустим, что эти продукты 250 КБ, а посещения более 100 КБ в день. При таких условиях в таблице slow_log регистрируется масса этих запросов с большим временем генерации.

У вас есть идеи, как оптимизировать данную проблему?

Таблица движок MyISAM.

1 Ответ

2 голосов
/ 09 марта 2010

Индекс на categoryId не поможет в этом случае, запросы IN (...) будут производить сканирование последовательности вместо поиска индекса в любом случае.

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

Например, вы можете создать вспомогательную таблицу items_category_groups (hash, item_id) и после запроса клиента по нескольким категориям хэшировать их объединенные идентификаторы и искать эту таблицу. Если не найдено, сделайте дорогой запрос и заполните эту таблицу. Если найден, сделайте дешевый запрос, соединяющий эти таблицы. Другие инструменты кеширования, такие как memcached, тоже будут работать.

...