Как проиндексировать поисковую таблицу в MySQL

У меня есть таблица из 10 миллионов строк 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, ....) .... Не все условия обязательно присутствуют во всех запросах.

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


person QWJ QWJ    schedule 03.10.2010    source источник


Ответы (2)


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

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

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

person Tomalak    schedule 03.10.2010
comment
Спасибо за совет. У меня в таблице таких полей около 10. Вы предлагаете составные индексы только из двух ключевых частей? или все 10? Да, цвет будет первой частью всех индексов. - person QWJ QWJ; 03.10.2010
comment
@QWJ Мое предложение - две ключевые части для каждого индекса, 10 индексов для вашей таблицы. Таким образом, MySQL уже может удовлетворить наиболее значительную часть запроса, глядя на один индекс (цвет + x). Вот еще кое-что по теме. - person Tomalak; 03.10.2010
comment
Вы могли бы, возможно, собрать статистику о сделанных запросах (например, записать запросы в журнал) и удалить индексы, которые почти никогда не используются, если большое количество индексов начинает вызывать проблемы. - person Brian Hooper; 03.10.2010
comment
У индексов @QWJ есть две нижние стороны: а) они увеличивают размер таблицы и б) они замедляют любую операцию записи (вставку, обновление, удаление) в таблицу, потому что не только таблица, но и каждый затронутый индекс нуждается в изменении. . Удаление ненужных индексов обычно улучшает производительность записи, создание необходимых индексов обычно улучшает производительность чтения. Поиск правильного баланса зависит от варианта использования. - person Tomalak; 03.10.2010
comment
Спасибо всем. Я попробую создать 10 индексов из 2 частей. Но в будущем, когда таблица вырастет, мне, вероятно, понадобится больше частей в составных индексах - все равно головная боль. Что касается вставок, я рассмотрю кластер, репликацию и т. Д. - person QWJ QWJ; 04.10.2010

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

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

person Waleed Eissa    schedule 03.10.2010