Mysql非常慢的性能使用按条款排序

时间:2018-08-03 16:16:06

标签: mysql performance group-by pagination sql-order-by

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

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时,尽管我使用了分页限制,但是此查询变慢了。

如何加快查询速度?

1 个答案:

答案 0 :(得分:3)

您无法按原样加快查询的速度,MySQL需要访问每一行并计算总和,然后再进行排序并最终返回第一行。那肯定要花时间。你也许可以作弊。

最明显的方法是使用用户ID和总数创建一个汇总表。当基表发生更改时,请对其进行更新,或定期对其进行重新计算,无论有什么意义。在该表中,您可以为总数编制索引,这使查询变得微不足道。

另一个选择可能是寻找最重要的用户。大多数站点的用户比其他站点更活跃。将1000个顶级用户保留在单独的表中,然后对顶级用户使用相同的选择(即与该表联接)。仅需要访问最高用户的用户活动行,这应该很快。如果1000个用户不足,则可能有10000个可用。