我有一个有数百万个条目的表。下面是表结构。
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时,尽管我使用了分页限制,但是此查询变慢了。
如何加快查询速度?
答案 0 :(得分:3)
您无法按原样加快查询的速度,MySQL需要访问每一行并计算总和,然后再进行排序并最终返回第一行。那肯定要花时间。你也许可以作弊。
最明显的方法是使用用户ID和总数创建一个汇总表。当基表发生更改时,请对其进行更新,或定期对其进行重新计算,无论有什么意义。在该表中,您可以为总数编制索引,这使查询变得微不足道。
另一个选择可能是寻找最重要的用户。大多数站点的用户比其他站点更活跃。将1000个顶级用户保留在单独的表中,然后对顶级用户使用相同的选择(即与该表联接)。仅需要访问最高用户的用户活动行,这应该很快。如果1000个用户不足,则可能有10000个可用。