Ваш вывод EXPLAIN показывает, что у вас уже есть индексы, которые могут быть полезными, но механизм запросов решил их не использовать.
http://dev.mysql.com/doc/refman/5.0/en/using-explain.html говорит:
Использование временного
Для разрешения запроса MySQL необходимо
создать временную таблицу для хранения
результат. Обычно это происходит, если
запрос содержит GROUP BY и ORDER BY
пункты, которые перечисляют столбцы по-разному.
Ваш запрос включает в себя:
GROUP BY `credit_balance`.`credit_used_acc`
ORDER BY `users_usr`.`id_usr`
Вы называете разные столбцы в этих двух пунктах, поэтому это означает, что для запроса требуется временная таблица и результаты сортируются на диске. Дисковый ввод-вывод - главный враг производительности SQL. Это, вероятно, вредит производительности, чем вы можете восполнить, применяя индекс.
Так что я бы предложил попробовать удалить предложение ORDER BY
и посмотреть, избавится ли оно от комментария «использование временного».
edit Хорошо, я сделал еще несколько тестов и более внимательно посмотрел на ваши таблицы.
Я думаю, что у вас есть много индексов, которые являются избыточными и не применимы к этому текущему запросу. Это могут быть индексы, полезные для какого-либо другого запроса, или они могут быть просто остатками ваших экспериментов.
Одно наблюдение состоит в том, что ваше присоединение к cfc_cfc
не является необходимым, но я вижу из вашего комментария, что вы удалили его. Похоже, что это не исправить отчет EXPLAIN.
Другое наблюдение состоит в том, что ваш LEFT JOIN
не нужен; это может быть INNER JOIN
, потому что в любом случае у вас есть условия в предложении WHERE
для этих столбцов. Нет смысла в том, чтобы это было внешнее соединение, а внешние соединения имеют тенденцию быть медленнее.
Индексы могут быть полезны для столбцов, которые вы используете в условиях соединения, или в ограничениях строк, или в предложениях GROUP BY или ORDER BY. MySQL не может использовать более одного индекса на таблицу в данном запросе, поэтому имеет смысл определить составные индексы. Но вы должны определить индекс по столбцам, которые используются в запросе. Если вы используете только столбцы 2 и 3 индекса из трех столбцов (т. Е. Не первый столбец в индексе), тогда индекс неэффективен.
Конечно, существуют индексы, созданные неявно для всех ограничений первичного ключа и внешнего ключа, но вот единственный дополнительный индекс, который я создал:
KEY columns_used_in_query (uid_usr, type_acc, status_acc, linetype_acc),
План оптимизации не должен иметь значения, если вы поместите свои условия в условие WHERE
или условие соединения, если они не являются частью условий для внешнего соединения. Но я заметил, что при прочих равных условиях оптимизатор, похоже, выбирает индекс, основанный на том, который вы определяете первым!
Я все еще не удалил временную таблицу и комментарий сортировки файлов в отчете EXPLAIN, но я думаю, что эти изменения ускорят запрос.