Индекс покрытия не совпадает с составным индексом.
Если у меня есть 2 отдельных индекса, один на col3, а другой на col4, какой из них будет использоваться в этом запросе?
Индекс с наивысшей кардинальностью.
MySQL хранит статистику того, какие индексы имеют какие свойства.
Будет использован индекс, который обладает наибольшей способностью различения (как видно из статистики MySQL).
Я где-то читал, что для каждой таблицы в запросе используется только один индекс. Означает ли это, что в запросе нельзя использовать оба индекса?
Вы можете использовать подвыбор.
Или даже лучше использовать составной индекс, который включает как col3, так и col4.
Во-вторых, если я создал составной индекс, используя и col3, и col4 вместе, но использовал только col3 в предложении WHERE, будет ли это хуже для производительности? пример:
Составной индекс
Правильный термин - индекс compound
, а не составной.
Будет использоваться только самая левая часть составного индекса.
Так что, если индекс определен как
index myindex (col3, col4) <<-- will work with your example.
index myindex (col4, col3) <<-- will not work.
См .: http://dev.mysql.com/doc/refman/5.0/en/multiple-column-indexes.html
Обратите внимание, что если вы выберете крайнее левое поле, вы можете избежать использования этой части индекса в предложении where.
Представьте, что у нас есть составной индекс
Myindex(col1,col2)
SELECT col1 FROM table1 WHERE col2 = 200 <<-- will use index
SELECT * FROM table1 where col2 = 200 <<-- will NOT use index.
Причина, по которой это работает, заключается в том, что первый запрос использует индекс покрытия и сканирует его.
Второй запрос должен получить доступ к таблице и по этой причине сканировать, хотя индекс не имеет смысла.
Это работает только в InnoDB.
Что такое индекс покрытия
Индекс покрытия относится к случаю, когда все поля, выбранные в запросе, имеют индекс covered
, в этом случае InnoDB (не MyISAM) никогда не будет считывать данные в таблице, а будет использовать только данные в индексе, что значительно ускоряет до выбора.
Обратите внимание, что в InnoDB первичный ключ включен во все вторичные индексы, поэтому в некотором смысле все вторичные индексы являются составными.
Это означает, что если вы выполните следующий запрос на InnoDB:
SELECT indexed_field FROM table1 WHERE pk = something
MySQL всегда будет использовать индекс покрытия и не будет обращаться к фактической таблице.