ALL - сканирование таблицы, range - сканирование диапазона (из-за LIMIT).Ничего плохого в этом нет, на самом деле это также вызывает использование ключа (key_status_tip_domeniu
).
Причина, по которой вы работаете медленно, заключается, скорее всего, в том, что вы используете ORDER BY data_publicarii DESC
(это легко проверить,просто отбросьте ORDER BY и сравните тест с запросом; ожидайте несколько порядков).
Mysql признает (в столбце «Дополнительные» объяснения), что использует файловую сортировку (необходимо для упорядочения, потому что он не может или делаетне знаю, как использовать индекс).Добавление еще одного индекса в микс может помочь, особенно если вы подтвердите, что ORDER BY делает его медленным.
EDIT На самом деле, в вашем запросе есть кардинальный грех:
Unix_timestamp(TIMESTAMPADD(DAY, 1, CAST(From_unixtime(l.data_limita)
AS DATE)))
< '1300683793'
Избегайте применения каких-либо функций к значениям поля, если вы можете применить их к константе.Так что поменяйте его и переписайте как
l.data_limita < some_function('1300683793')
Как бы ни было завершено some_function
, оно будет вычислено только один раз.Mysql планировщик будет знать, что это постоянная.То, как вы это написали, заставит mysql применить unix_timestamp
, timestampadd
, cast
и from_unixtime
к значению data_limita
из каждой строки.Теперь в системах, связанных с вводом / выводом, это обычно просто сжигает некоторые дополнительные циклы ЦП, ожидая вращения дисков (однако, это может стать значительным, ваша система может быть привязана к ЦП, и это просто плохо).Самое большое отличие состоит в том, что вы теряете возможность использовать индекс для data_limita
.
Наконец, все ваши индексы являются индексами одиночного поля, а mysql выполняет некоторое объединение индексов , но не является звездным в нем,Возможно, вы захотите попробовать создать индексы, которые охватывают все ваши условия и порядок сортировки (в порядке селективности для целевого запроса).