MySQL慢速分组依据/订单依据

MySQL慢速分组依据/订单依据,mysql,performance,join,sql-order-by,Mysql,Performance,Join,Sql Order By,以下查询相对较慢(0.7秒,约6k行) 但按items.ID DESC而不是items.DATE订购时,速度会显著加快。事务连接到一个大表(约250k行),并且是一对多的。日期列有一个索引 是否有任何方法可以通过以下方式全面提高订单的性能 编辑:items.user、transactions.item和items.date上的索引。条目有49列,用户76列,事务17列。索引可以影响ORDER BY子句的性能。这可能值得你花时间。本质上,如果您按MySQL用于查询的索引的一部分的列排序,MySQL

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

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

是否有任何方法可以通过以下方式全面提高订单的性能


编辑:items.user、transactions.item和items.date上的索引。条目有49列,用户76列,事务17列。

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

在您的特定查询中,
DATE
列具有索引这一事实并不重要,因为该索引可能没有在您的查询中使用。您的
WHERE
语句包含
items.ACTIVE
items.DELETED\u AT
,如果这些列的
WHERE
索引不包含
DATE
列,那么MySQL无法使用该索引按
日期进行排序,并且可能会采用文件排序

如果你能想出一个既能被
WHERE
使用,又能被
orderby
使用的索引,你就会得到一个优化提升。在这种情况下,
items.ACTIVE
看起来像是一个低基数列,因此假设
items.DELETED\u AT
是一个日期,我可能会为该表尝试类似于
index(DELETED\u AT,date)
的索引


如果你想了解更多关于那里发生的事情,你可能会得到一些更深入的见解。

这些东西可能(阅读不一定)有帮助

  • 删除项上的*并单独列出每个字段。49 栏目很多;你真的需要它们吗
  • 通常引擎会优化查询,以便 在联接上考虑条件。也许是政府使用的计划 引擎没有这样做(需要解释计划结果才能知道)所以 重新安排where子句和联接可能(不太可能)有助于 迫使发动机考虑这一点。(见下文)
  • 如果有多个更新、插入和删除,则重新生成表统计信息 随着时间的推移发生,表统计信息可能已关闭或丢失 需要 每张桌子

  • 上面的查询非常完美,我已经在一个很长的数据库中使用了它。它通过我们从内部select查询中获得的10个或(xx)个项目的列表进行排序,因此速度非常快

    您能为这三个表提供模式,特别是索引吗?我唯一能想到的是,首先在子查询中选择由WHERE子句过滤并按日期排序的项(或者在视图中,如果MySQL不支持ORDER by in子查询),然后在封闭查询中执行联接。(我写这篇文章不是为了回答问题,因为它不鼓励猜测性的回答。)你有没有试过把
    项目.日期
    包括在
    分组方式
    (也在第一个位置)?你甚至没有使用左键
    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
    
    SELECT items.[list fields], COUNT(transactions.ID)
       FROM items
      INNER JOIN users ON (items.USER = users.ID)
            AND items.Active=1 
            AND items.DELETED_AT is Null
       LEFT JOIN transactions ON (items.id = transactions.item)
      GROUP BY items.ID
      ORDER BY items.DATE DESC
      LIMIT 20
    
    SELECT *
    FROM (SELECT * FROM wp_users WHERE 1 GROUP BY ID limit 0,10) as X
    ORDER BY ID DESC