Как проиндексировать таблицу поиска в MySQL - PullRequest
3 голосов
/ 03 октября 2010

У меня есть таблица из 10M строк product с полями, такими как color (int), price (float), weight (float), unitprice (int), и т. Д. ... Теперь пользователи из Интернета динамически генерируют запросы для поиска данных из этой таблицы со случайными условиями (цвет должен быть здесь) и порядок такими как

select * from product where color=1 and price >5 and price <220 and .... order by unitprice limit 75, 25;

select count(*) from product where color=3 and weight <500 and price <30 ... ;

Как проиндексировать таблицу (InnoDB или NDB) примерно с 10 возможными полями фильтрации (с диапазоном, сортировкой ...), как это происходит в MySQL?


РЕДАКТИРОВАТЬ: В моем понимании MySQL, скорее всего, будет выбирать только один индекс для запроса, и будет работать только левая часть составного индекса. Очевидно, что индексирование всех возможных комбинаций не является возможным вариантом, например (color, price, weight, create_date, unitprice, ....), (color, weight, price, create_date, unitprice, ....), (color, unitprice, weight, ....) .... Не все условия обязательно присутствуют во всех запросах.

Что бы вы сделали, чтобы проиндексировать эту таблицу?

Ответы [ 2 ]

1 голос
/ 03 октября 2010

Если вы хотите быстрый поиск / фильтры / сортировки в любом поле, вы должны поместить индексы на все из них.

Если цвет является обязательным (т.е. используется в каждом запросе)Лучше всего составлять индексы на (color, field) для каждого field, который у вас есть.

Размещение кластерного индекса над (color, product_id) также стоит попробовать, если color действительно является частью каждого общего запроса.

0 голосов
/ 03 октября 2010

Как уже ответил Томалак, вам, вероятно, следует добавить индексы для всех полей (и составные индексы в зависимости от ваших запросов). Но, конечно, это может замедлить запись.

Если вы не уверены, как будут использоваться индексы, вы можете использовать команду объяснение .

...