为什么此查询不对ORDER BY使用索引?

时间:2019-01-26 12:49:38

标签: mysql optimization indexing sql-order-by query-optimization

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放慢速度呢?表格有3M列。

1 个答案:

答案 0 :(得分:1)

请确保您有一个复合索引来覆盖

所在位置的所有列,而不是每个位置的索引

例如

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中的date或others列可能很有用,它使用索引来检索所有信息,并避免访问表数据..但是对于全选(请选择*)  您可能需要几个列,然后才能完成对表数据的访问..但是您可以尝试评估性能..

注意将不涉及的数据放置在所有与之相关的列的右侧

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