gpt4 book ai didi

使用 Order by Clause 的 Mysql 性能非常慢

转载 作者:太空宇宙 更新时间:2023-11-03 11:28:52 25 4
gpt4 key购买 nike

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

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;

当我在没有 ORDER BY 的情况下执行上述查询时,它会给我快速的结果集但是当使用 ORDER BY 时,这个查询变慢了,尽管我使用了分页限制。

我可以做些什么来加速这个查询?

最佳答案

您不能按原样加速查询,MySQL 需要访问每一行并在排序之前计算总和,最后返回第一行。这必然需要时间。不过,您可能会作弊。

最明显的方法是创建一个包含 userid 和 total 的汇总表。当基表发生变化时更新它或定期重新计算它,只要有意义。在该表中,您可以索引总计,这使得查询变得微不足道。

另一种选择可能是找到顶级用户。大多数站点的用户都比其他站点更活跃。将 1000 个顶级用户保存在一个单独的表中,然后使用相同的选择但仅针对顶级用户(即加入该表)。只需要访问顶级用户的用户事件行,这应该很快。如果 1000 个用户不够用,也许 10000 个可行。

关于使用 Order by Clause 的 Mysql 性能非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51676576/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com