MySQL缓慢分组/顺序

Sel*_*ity 6 mysql performance join sql-order-by

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

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
Run Code Online (Sandbox Code Playgroud)

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

有没有办法一般性地提高ORDER BY的性能?

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

zom*_*bat 5

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

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

如果你能想出一个既可以被WHERE和也可以使用的索引ORDER BY,你就可以获得优化.在这种情况下,items.ACTIVE看起来像一个低基数列,所以假设items.DELETED_AT是一个日期,我可能会尝试像INDEX(DELETED_AT,DATE)该表一样的索引.

使用EXPLAIN SELECT...可进一步了解发生了什么事情有太多,你可能会得到一些进一步的见解.