通过在mysql中使查询非常慢来分组和排序?
Posted
技术标签:
【中文标题】通过在mysql中使查询非常慢来分组和排序?【英文标题】:group by and order by making query very slow in mysql? 【发布时间】:2014-05-15 14:53:58 【问题描述】:这个查询执行很快:
SELECT SQL_NO_CACHE users.id, users.name
FROM users
LEFT JOIN user_statistics ON users.id = user_statistics.user_id
WHERE users.is_deleted = 0
GROUP BY users.id
ORDER BY users.updated_at
LIMIT 50
这个慢慢来:
SELECT SQL_NO_CACHE users.id, users.name, MAX(user_statistics.access_time) AS user_access_time
FROM users
LEFT JOIN user_statistics ON users.id = user_statistics.user_id
WHERE users.is_deleted = 0
GROUP BY users.id
ORDER BY user_access_time
LIMIT 50
这是慢查询的解释输出:
*************************** 1. row ***************************
id: 1 select_type: SIMPLE
table: users
type: ref possible_keys: fk_users_is_deleted
key: fk_users_is_deleted
key_len: 4
ref: const
rows: 107696
Extra: Using where; Using temporary; Using filesort
*************************** 2. row ***************************
id: 1 select_type: SIMPLE
table: user_statistics
type: ref possible_keys: fk_user_statistics_user_id
key: fk_user_statistics_user_id
key_len: 4
ref: users.id
rows: 1
Extra:
我在不同的桌子上使用GROUP BY
和ORDER BY
。如何优化上述慢查询?
【问题讨论】:
为使 SQL 查询更易于阅读,请考虑将 SQL 关键字设为大写。 有多少用户?我看不到最终文件排序的任何方法来按访问时间排序,所以如果大部分时间都用于这种排序,那么这可能是一个问题。 @GordonLinoff 用户 - 195479 “慢”有多慢?该查询必须对 195k 条记录进行排序;这可能需要几秒钟。不需要几分钟。 快查询1秒,慢查询40秒。 【参考方案1】:尝试执行以下操作。首先,将查询重写为:
select u.id, u.name,
(select max(us.access_time) from user_statistics us where u.id = us.user_id
) as user_access_time
from users u
where u.is_deleted = 0
order by user_access_time
limit 50;
创建以下索引:
user_statistics(user_id, access_time);
user(is_deleted);
这应该会提高性能。
注意:我不喜欢用嵌套子查询替换 group by
,但有时它们的执行速度更快。如果只有 SQL 引擎可以进行这种优化。
【讨论】:
我无法从查询中删除 group by,因为我还有一个与此查询关联的左联接。 @krunalshah。 . .我无法回答不属于原始问题的神秘问题。这种方法是否比原始帖子中的方法更有效? 不,这对我没有帮助...抱歉没有发布原始查询。以上是关于通过在mysql中使查询非常慢来分组和排序?的主要内容,如果未能解决你的问题,请参考以下文章