通过在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 BYORDER 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中使查询非常慢来分组和排序?的主要内容,如果未能解决你的问题,请参考以下文章

mysql分组排序后取出几条记录,

mysql 查询排序分组问题

MySQL分组、排序

mysql分组查询和排序

mysql分组排序,取每组第一条数据

sql多表分组查询并排序的问题