我有一个有数百万个条目的表。下面是表结构。
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;
当我在没有顺序的情况下执行上面的查询时,它会给我快速的结果集,但是当使用顺序时,这个查询会变慢,尽管我使用了限制分页。
如何加快查询速度?
1条答案
按热度按时间bnl4lu3b1#
你不能像现在这样加快查询速度,mysql需要访问每一行并计算总和,然后再排序并最终返回第一行。这肯定需要时间。不过你也可以作弊。
最明显的方法是创建一个包含userid和total的摘要表。在基表更改时更新它,或者定期重新计算它,无论什么都有意义。在该表中,您可以索引total,这使得查询变得微不足道。
另一个选择可能是找到顶级用户。大多数网站都有比其他网站更活跃的用户。将1000个顶级用户保留在一个单独的表中,然后使用相同的select,但仅用于顶级用户(即,与该表联接)。只需要访问顶级用户的useractivity行,这应该很快。如果1000个用户还不够的话,也许10000个工作。