Вы, конечно, можете индексировать каждый столбец. Если вы это сделаете, 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
, чтобы не перекрывать всю таблицу. Нелегко точно ответить на этот вопрос, не зная точно данных и запросов.
Однако, если вы уверены, что никогда больше не будете писать в таблицу, вы можете также покрыть все это индексом, если пробел не является проблемой.