mysql使用order by子句的性能非常慢

xkftehaa  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(650)

我有一个有数百万个条目的表。下面是表结构。

CREATE TABLE `useractivity` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
 `userid` bigint(20) NOT NULL,
 `likes` bigint(20) DEFAULT NULL,
 `views` bigint(20) DEFAULT NULL,
 `shares` bigint(20) DEFAULT NULL,
 `totalcount` bigint(20) DEFAULT NULL,
 `status` bigint(20) DEFAULT NULL,
 `createdat` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`),
  KEY `userid` (`userid`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

下面是我表现缓慢的问题。

SELECT userid, 
 (sum(likes)+SUM(views)+SUM(shares)+SUM(totalcount)+SUM(`status`)) as total
from useractivity
GROUP BY userid
ORDER BY total DESC
limit 0, 20;

当我在没有顺序的情况下执行上面的查询时,它会给我快速的结果集,但是当使用顺序时,这个查询会变慢,尽管我使用了限制分页。
如何加快查询速度?

bnl4lu3b

bnl4lu3b1#

你不能像现在这样加快查询速度,mysql需要访问每一行并计算总和,然后再排序并最终返回第一行。这肯定需要时间。不过你也可以作弊。
最明显的方法是创建一个包含userid和total的摘要表。在基表更改时更新它,或者定期重新计算它,无论什么都有意义。在该表中,您可以索引total,这使得查询变得微不足道。
另一个选择可能是找到顶级用户。大多数网站都有比其他网站更活跃的用户。将1000个顶级用户保留在一个单独的表中,然后使用相同的select,但仅用于顶级用户(即,与该表联接)。只需要访问顶级用户的useractivity行,这应该很快。如果1000个用户还不够的话,也许10000个工作。

相关问题