MySQL 慢分组依据/排序依据

标签 mysql performance join sql-order-by

以下查询相对较慢(约 6k 行 0.7 秒)

SELECT items.*, COUNT(transactions.ID)
   FROM items
  INNER JOIN users ON (items.USER = users.ID)
   LEFT JOIN transactions ON (items.id = transactions.item)
  WHERE items.ACTIVE = 1
    AND items.DELETED_AT IS NULL
  GROUP BY items.ID
  ORDER BY items.DATE DESC
  LIMIT 20

但是当按 items.ID DESC 而不是 items.DATE 排序时,速度会显着加快。事务连接到一个大表(~250k 行)并且是一对多的。日期列有一个索引。

有什么方法可以普遍提高 ORDER BY 的性能吗?

编辑:items.user、transactions.item 和 items.date 的索引。项目有 49 列,用户 76 列,交易 17 列。

最佳答案

索引会影响 ORDER BY 子句的性能。这MySQL manual page可能值得你花时间。本质上,如果您按作为 MySQL 用于查询的索引的一部分的列排序,MySQL 可以使用索引而不是数据本身进行排序。

在您的特定查询中,DATE 列具有索引这一事实并不重要,因为该索引可能未在您的查询中使用。您的 WHERE 语句包含 items.ACTIVEitems.DELETED_AT,如果这些列具有用于 WHERE< 的索引 不包含 DATE 列,则 MySQL 无法使用该索引按 DATE 进行排序,并且可能会求助于文件排序。

如果您能想出一个可以同时被 WHEREORDER BY 使用的索引,您将获得优化提升。在这种情况下,items.ACTIVE 似乎是一个低基数列,因此假设 items.DELETED_AT 是一个日期,我可能会尝试使用 INDEX(DELETED_AT ,DATE) 该表。

使用EXPLAIN SELECT...要了解更多关于那里正在发生的事情,您可能会获得一些进一步的见解。

关于MySQL 慢分组依据/排序依据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8631488/

相关文章:

php - 连接两个表但每个表中记录数不同的问题

javascript - 使用 PHP 和 JavaScript 显示/禁用按钮

php - 使用一列中的多个值规范化 MySQL 数据库

performance - CUDA,相同工作的更多线程 = 尽管占用率更高,但运行时间更长,为什么?

MySQL 查询速度慢,发送/检查的行数等于 0

mysql - 何时在 MySQL 中使用 STRAIGHT_JOIN

php - 计算表中的一个字段直到给定值

MySQL IF 语句检查表是否为空

java - 网络吞吐量速度测试

php - MySQL 连接两个表 ID 以将结果从一个表生成到另一个表