Как проиндексировать эту таблицу (a_level, b_level, item_id) - PullRequest
0 голосов
/ 12 октября 2011

У меня есть таблица предметов, у каждого из них есть a_level, b_level и item_id.Любой b_level предназначен только для одного a_level (пример: b_level 14 является «потомком» только для a_level 2)

Допустим, у нас есть миллион элементов, все из которых вставлены один раз, а затем запрашиваются только SELECT.

Если я ВЫБИРАЮ элемент на основе item_id, то мне нужно проиндексировать столбец item_id.Это заставит MySQL просматривать все миллионы элементов, что плохо, так как у меня уже есть информация a_level и b_level.Поэтому я предполагаю, что если я ВЫБИРАЮ элемент на основе определенного уровня и у меня есть индекс для этого столбца, MySQL не должен будет просматривать все миллионы элементов, только элементы с этим конкретным уровнем.

Если яINDEX и для a_level, b_level (и, конечно, item_id) и SELECT WHERE a_level = b_level = item_id = это будет плохо?Я думаю, только INDEX для b_level и item_id и SELECT WHERE b_level = AND item_id = будет достаточно / лучшее решение?

Итак, так как у меня есть a_level и b_level (который, как я сказал, любой b_level является "потомком"только один a_level), какие будут самые эффективные SELECT и INDEX для создания предмета?

Ответы [ 2 ]

1 голос
/ 12 октября 2011

Вы, конечно, можете индексировать каждый столбец. Если вы это сделаете, MySQL будет использовать оптимизацию index merge для применения множества индексов к одному запросу. Однако для большей эффективности вы можете использовать составные индексы (один индекс на несколько столбцов). Составные индексы MySQL используются при оптимизации, следуя правилу с левым префиксом . Если оператор SELECT ограничен терминами, включенными в левый префикс индекса, используется этот индекс. Например, если у вас есть

SELECT * FROM t WHERE a_level = 1 AND b_level = 2

тогда соответствующий индекс должен будет включать a_level или b_level в качестве первых столбцов. Другими словами, индекс для (a_level, b_level) может индексировать запросы, такие как

SELECT * FROM t WHERE a_level = 1
SELECT * FROM t WHERE a_level = 1 AND b_level = 2

но не

SELECT * FROM t WHERE b_level = 2

потому что b_level не является левым префиксом индекса.

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

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

0 голосов
/ 12 октября 2011

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

...