Производительность многостолбцовых индексов MySQL при использовании только одного столбца в запросе - PullRequest
6 голосов
/ 04 ноября 2008

У меня есть запрос к моей базе данных как таковой:

SELECT * FROM expenses WHERE user_id = ? AND dated_on = ?

Я добавил индекс в таблицу для столбцов user_id и dated_on. Когда я проверяю индексы с помощью SHOW INDEXES FROM expenses, появляются две строки - одна со значением seq_in_index, равным 1, другая со значением seq_in_index, равным 2.

У меня вопрос, если я затем отправлю запрос, который использует только одно из двух предложений WHERE, например ::

SELECT * FROM expenses WHERE user_id = ?

Есть ли какое-либо преимущество в создании другого индекса, который индексирует только столбец user_id, или же описанный выше индекс user_id / dated_on будет использоваться так же эффективно?

Наконец, как насчет использования запроса:

SELECT * FROM expenses WHERE dated_on = ?

Как значение seq_in_index 2 влияет на использование индекса и производительность в этой ситуации?

Ответы [ 2 ]

8 голосов
/ 04 ноября 2008

MySQL может использовать любую левую часть индекса .

В вашем примере SELECT * FROM expenses WHERE user_id = ? будет использовать индекс, но SELECT * FROM expenses WHERE dated_on = ? не будет.

Для индекса из трех столбцов A, B, C WHERE A = ? AND B = ? будет использовать индекс над A и B, но WHERE A = ? AND C = ? будет использовать только индекс для A

5 голосов
/ 04 ноября 2008

Если ваш индекс для user_id и dated_on действительно в этом порядке (сначала user_id), то он будет также использоваться для запроса user_id Вы можете проверить с помощью EXPLAIN, чтобы увидеть фактическую стратегию для запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...