У меня есть таблица InnoDB, содержащая ~ 1,7 млн строк в MySQL 5.7.19 .Я хочу оптимизировать следующий запрос:
select * from `table` where `col1` = 'x' and `col2` = 123 and `col3` = 'z'
, где столбцы определены как (все используют кодировку utf8mb4):
col1 varchar(255) null
col2 varchar(255) not null
col3 varchar(255) not null
и индекс для всех столбцов:
key (
col1, -- Cardinality: 40
col2, -- Cardinality: 472810
col3 -- Cardinality: 403767
)
Я ожидаю, что запрос будет выполняться быстро, потому что MySQL должен быть в состоянии полностью использовать индекс.Теперь производительность не так хороша, и она начинает иметь смысл, когда я запускаю запрос с explain format=json
:
"used_key_parts": [
"col1"
],
"key_length": "1022"
Используется только первый столбец составного индекса.Ограничения для col2
и col3
оцениваются с помощью сканирования таблицы.
Может ли кто-нибудь объяснить мне, что здесь происходит, и дать совет, как это исправить?
Iв настоящее время это решается путем объединения столбцов в один столбец, путем введения и индексации сохраненного сгенерированного столбца, который объединяет col1
и col2
.Однако я не могу использовать это для запросов, которые хотят использовать оператор IN()
в этих столбцах.
Заранее спасибо!
Jarno