(я полагаю, вы используете InnoDB.)
INDEX(col2, ...)
будет лучше, если IN
будет более избирательным, чем >
.
INDEX(col3, ...)
будет лучше, если >
будет более избирательным.
- InnoDB всегда помещает столбцы
PRIMARY KEY
в конец каждого вторичного индекса. Следовательно, INDEX(col2, col3)
очень похож на INDEX(col2, col3, col1)
, который "покрывает". То же самое для (col3, col2)
.
- Ожидая, что PK будет добавлен, я явно добавляю его - это подсказка другим пользователям (и мне), что я стремился к «покрытию» или что-то в этом роде.
- Оптимизатор (ср. «MRR») может иметь возможность перепрыгнуть через
IN
значения, поэтому ...
Я рекомендую специально:
INDEX(col2, -- hoping to leapfrog
col3, -- assuming the leapfrogging works
col1) -- covering
Это , может лучше изменить на PRIMARY KEY(col2, col1)
, а не имеют дополнительный индекс. Это предполагает , что у вас не было col1
первым на ПК, чтобы воспользоваться некоторыми другими запросами / запросами.
Как составной индекс создается в BTree? Подумайте о соединении столбцов (col1, col2) вместе, чтобы создать один ключ. (Детали могут быть более запутанными, но думать об этом "работает".)
Примечание: данные - это дерево данных, упорядоченное в соответствии с PK. Вторичный индекс - это BTree столбцов во вторичном индексе, плюс PK, в конечных узлах ничего лишнего.
MySQL и MariaDB хранят все индексы на диске (см. Выше), затем кэшируют блоки по 16 КБ в «buffer_pool», который находится в ОЗУ. После некоторого времени работы системы блоки индекса стремятся в этот кеш ; блоки данных могут или не могут.
Если вы смотрите, скажем, «новые» строки в большой, ориентированной по времени таблице, то блоки, индексированные по дате или идентификатору AUTO_INCREMENT
, будут иметь тенденцию быть в оперативной памяти, тогда как «старые» строки остаются на диске.
В этом прелесть «кеширования» - вы приближаетесь к «бесплатной еде», чем неуклюжими техниками. Например ... «Я загружу все свои индексы в оперативную память». Но что, если я использую только «новые» его части; это вытеснит другие виды использования оперативной памяти. «Я заблокирую эту таблицу в оперативной памяти». Опять же, это связано с другим использованием ОЗУ, которое может быть более эффективным.