【问题标题】:Why does this query doesn't use index for ORDER BY?为什么此查询不使用 ORDER BY 的索引?
【发布时间】:2019-06-20 01:39:13
【问题描述】:
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 行。

【问题讨论】:

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


【解决方案1】:

确保你有一个复合索引覆盖 where 中的所有列,而不是每列的索引

例如

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

避免IN子句用于单值使用=这些

  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

选择中的日期或其他列可能很有用,使用索引检索所有信息并避免访问表数据..但对于全选(选择 *) 您可能需要几列然后才能完成对表数据的访问..但是您可以尝试评估性能..

注意将不涉及where的数据放在where所有涉及的列的右边

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

【讨论】:

  • 日期字段是否也需要在复合索引中?
  • 即“如果索引可以完全通过WHERE子句ORDER BY,那么查询可以在LIMIT行之后停止。”
  • No never ...查询选择所有行..产生临时结果..执行排序,当排序结果完成时..仅选择限制。 ...不使用索引的顺序..您只能产生更快的查询...使用适当的索引
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 2011-09-06
  • 1970-01-01
相关资源
最近更新 更多