Почему этот запрос не использует индекс для ORDER BY? - PullRequest
0 голосов
/ 26 января 2019
SELECT `f`.*
FROM `files_table` `f`
WHERE f.`application_id` IN(6)
AND `f`.`project_id` IN(130418)
AND `f`.`is_last_version` = 1
AND `f`.`temporary` = 0
AND f.deleted_by is null
ORDER BY `f`.`date` DESC
LIMIT 5

Когда я удаляю ORDER BY, запрос выполняется за 0,1 секунды.С ORDER BY это занимает 3 секунды.

Существует индекс для каждого столбца WHERE, а также индекс для поля ORDER BY (дата).

Что можно сделать, чтобы сделать этозапрос быстрее?Почему ORDER BY так сильно его тормозит?Таблица содержит 3М строк.

1 Ответ

0 голосов
/ 26 января 2019

вместо индекса для каждого столбца, где убедитесь, что у вас есть составной индекс, который охватывает все столбцы, где

например,

create index  idx1 on files_table (application_id, project_id,is_last_version,temporary,deleted_by)

избегать предложения IN для одного значения use =для этих

  SELECT `f`.*
  FROM `files_table` `f`
  WHERE f.`application_id`  = 6 
  AND `f`.`project_id` = 130418
  AND `f`.`is_last_version` = 1
  AND `f`.`temporary` = 0
  AND f.deleted_by is null
  ORDER BY `f`.`date` DESC
  LIMIT 5

столбец даты или других в select может быть полезен для извлечения всей информации, используя индекс и избегая доступа к данным таблицы ... но для выбора всех (select *) вам, вероятно, понадобятся столбцы severlтогда доступ к данным таблицы будет выполнен, однако ... но вы можете попытаться оценить производительность ..

Будьте осторожны, чтобы поместить данные, не относящиеся к тому, где, справа от всех столбцов, к которым относится

create index  idx1 on files_table (application_id, project_id,is_last_version,temporary,deleted_by, date)
...