У меня есть таблица с 30 000 строк (и она растет), к которой я присоединяюсь к другой таблице. На некоторых страницах мне нужно выполнить более 100 таких запросов, и все становится медленнее. Если я EXPLAIN
выполняю запрос, я замечаю, что одна таблица использует первичный ключ и работает быстро, а другая таблица использует один из своих индексов, который не самый лучший. Вот обзор:
SIMPLE | acc_entries | ref | ledger,date,type,status,status_ledger_date_type | type | 1 | const | 15359 | Using where
Это пример запроса:
SELECT SUM(usd) AS total FROM acc_entries
LEFT JOIN acc_ledgers ON acc_entries.ledger = acc_ledgers.id
WHERE acc_entries.status = 1 AND
acc_ledgers.account = 3004 AND
date >= '2011-01-01' AND
date <= '2011-08-30' AND
type = 'credit'
Как видите, я использую в WHERE поля status
, ledger
(это поле, которое соединяется с acc_ledgers.account
), date
и type
. Все эти поля имеют индексы. Однако существует также специальный индекс, который используется для всех из них в том же порядке. Он называется status_ledger_data_type
, и, как вы видите, это один из индексов, которые MySQL рассматривает для использования. Однако в конце MySQL предпочитает использовать type
в качестве индекса. Он содержит около 15 000 возможных строк (половина таблицы), в то время как другой комбинированный индекс содержит лишь часть этого числа. Итак, мои вопросы: почему MySQL выбирает этот индекс, когда доступен лучший, и как я могу предотвратить это?