У меня есть таблица с 30000 строками (и растущая), к которой я присоединяюсь с другой таблицей. Несколько страниц, мне нужно выполнить более 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 выбирает этот индекс, когда доступен лучший, и как я могу предотвратить это?