У меня есть таблица mysql my_table
, которая имеет следующий столбец:
start_cell, end_cell, field_1, field_2, field_3 ..., field_n
Большую часть времени я хочу сделать что-то вроде:
select * from my_table where start_cell = 'cell_1234' and end_cell = 'cell_5678'
start_cell
и end_cell
- от cell_1
до cell_9000
Для ускорения поиска я сделал следующий индекс:
alter table my_table add index(start_cell)
Пока это прекрасно. Тем не менее, мне интересно, есть ли какой-нибудь лучший индексный подход для этой проблемы? Спасибо!
Если вы обычно проверяете оба столбца в запросах, вы должны создать индекс с несколькими столбцами.
ALTER TABLE my_table ADD INDEX (start_cell, end_cell);
Этот индекс также будет эффективен для запросов, которые просто проверяют start_cell
, поскольку индекс с несколькими столбцами также является индексом для любого префикса индекса (это естественное следствие индексов B-дерева).
Если вам также нужно оптимизировать запросы, которые тестируют end_cell
без start_cell
, вы можете добавить второй индекс:
ALTER TABLE my_table ADD INDEX (end_cell);
Вопрос немного широк, вы должны учитывать jbto типы полей, которые start_cell и end_cell - любое другое использование, отличное от простого select *
использующего объединение или группу по индексам, иногда может быть более полезным, если объединение более одного поля, хотя, похоже, это не так
В общем, лучший способ проверить правильную индексацию - использовать select select, то есть:
EXPLAIN select * from my_table where start_cell = 'cell_1234' and end_cell = 'cell_5678'
Он покажет вам слабые места вашего запроса, и будет иметь возможность указать вам на лучший подход MySQL объяснить выбор