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列。
答案 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)