MySQL慢速分组依据/订单依据
以下查询相对较慢(0.7秒,约6k行) 但按items.ID DESC而不是items.DATE订购时,速度会显著加快。事务连接到一个大表(约250k行),并且是一对多的。日期列有一个索引 是否有任何方法可以通过以下方式全面提高订单的性能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
编辑: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