@codercat

Индекс на несколько полей одновременно или на каждое по одному?

Есть таблица, в которой много разных полей, по которым идёт выборка:
some_table.png

Выборка всегда по разным полям, например:
SELECT `id`, `field1`, `filed2`, `field3`, `field4` WHERE `field1` = 1;
SELECT `id`, `field1`, `filed2`, `field3`, `field4` WHERE `field1` = 3 AND `field2` = 3;
SELECT `id`, `field1`, `filed2`, `field3`, `field4` WHERE `field2` = 4 AND `field1` = 3 AND `field3` = 2 AND `field4` = 1;
SELECT `id`, `field1`, `filed2`, `field3`, `field4` WHERE `field3` = 6 OR `field2` = 3;
...


Как, в таком случае, лучше ставить индексы, сразу по всем (кроме id, он AI) или 4 индекса по 1 на каждое поле?

ALTER TABLE  `some_db`.`some_table` ADD INDEX (`field1` , `field2`, `field3`, `field4`)
или
ALTER TABLE  `some_db`.`some_table` ADD INDEX (`field1`)
ALTER TABLE  `some_db`.`some_table` ADD INDEX (`field2`)
ALTER TABLE  `some_db`.`some_table` ADD INDEX (`field3`)
ALTER TABLE  `some_db`.`some_table` ADD INDEX (`field4`)
  • Вопрос задан
  • 6003 просмотра
Решения вопроса 3
egor_nullptr
@egor_nullptr
В последних версиях MySQL наконец-то заработал merge index, поэтому можно ставить отдельный индекс на каждое поле не заморачиваясь на составные индексы. Советую вам для начала поступить именно так и прогнать все запросы через EXPLAIN, если не увидите в последнем столбце merge index, то тогда уже начинайте добавлять составные индексы.
Ответ написан
maxaon
@maxaon
Индекс на четыре столбца будет использоваться только в случае 1,2,3. Т.е. сначала должна быть выборка по field1, потом по field2. В четвертом случае индекс использован не будет.
К тому же важен порядок столбцов, см хабр.
Теоретически можно сделать общий индекс, и индекс на 2,3,4 поле. Все зависит от полей.
И укрепите знания по индексам www.mysql.ru/docs/man/MySQL_indexes.html
Ответ написан
Комментировать
Lerg
@Lerg
Defold, Corona, Lua, GameDev
Индекс на все поля работает когда идёт выборка по field1, по field1+field2, по field1+field2+field3+field4 и не работает при выборке field2+field3.
Возможно имеет смысл сделать два индекса на несколько полей:
INDEX (`field1` , `field2`, `field3`, `field4`)
INDEX (`field2`, `field3`)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы