SELECT COUNT(*)超级慢,讨论一下解决方案

2018-05-14 13:35:02 +08:00
 Aluhao

使用场景: 1、回复表 1 亿多数据,每天增长 1 万+; 2、发回复的时候得统计回复用户回复数量;

使用的语句:SELECT COUNT(*) FROM answer WHERE uid='10' 查询结果:6963911 使用时间:101.618 秒 其中 uid 已经索引,也用过其它 COUNT(其它列字段) 查询一样很慢; 如果用 aid 已经索引,aid='10' 查出结果数量少,查询很快;

还能通过优化 SQL 语句来优化吗,如果不行,只能通过 insert +1 及 delete -1 来解决了。

19733 次点击
所在节点    MySQL
67 条回复
3dwelcome
2018-05-14 13:44:54 +08:00
用 MyISAM 表示速度奇快。而且用 mysql_list_tables 之类的结构查询,就能直接看一共有多少记录。
kingwrcy
2018-05-14 13:45:36 +08:00
分库,分表,冷数据备份,迁移.
linpf
2018-05-14 13:47:07 +08:00
单表数据上亿,早就该拆表了吧。
Aluhao
2018-05-14 13:47:15 +08:00
@3dwelcome 现在就是用 MyISAM,数据量小很快的。
kran
2018-05-14 13:47:33 +08:00
explain 一下
yiqiao
2018-05-14 13:47:54 +08:00
回复数量不少应该记录在类似文章表里面吗。。。
RorschachZZZ
2018-05-14 13:49:02 +08:00
按照用户分组全量统计一次,保存起来。以后关于用户回复数的增删改查都来操作这次保存的数据。而且你这个表太大了是个隐患,最好拆。
zhaishunqi
2018-05-14 13:51:46 +08:00
我印象中,select count(*) 和 select count(1) 的效率,在数据量大的情况下,差别还是很大的.
只是前者后者用法有略微的差别,会用就能避坑。
q397064399
2018-05-14 13:54:41 +08:00


如果并发量不是很大的话,+1 -1 应该是个不错的选择
glues
2018-05-14 13:55:57 +08:00
这个问题快成日经贴了,不要用 MySQL 不就好了
doubleflower
2018-05-14 13:57:52 +08:00
这种东西明显是要保存每个分组的 count,以后发贴+1
mchl
2018-05-14 14:01:16 +08:00
试一下
SELECT COUNT(uid) FROM answer WHERE uid='10';
FrailLove
2018-05-14 14:07:29 +08:00
物化视图查询重写 了解一下
ourzhang
2018-05-14 14:07:54 +08:00
COUNT ( 1 ) 试试。
xi4oh4o
2018-05-14 14:08:30 +08:00
如果需求不用很精准的话,可以尝试用 explain select count(*) from table 取
af463419014
2018-05-14 14:17:24 +08:00
分区表,了解一下

比如: PARTITION BY HASH (uid) PARTITIONS 1000
sagaxu
2018-05-14 14:18:03 +08:00
主流关系数据库 count 需要遍历,时间复杂度是 O(n)
akstrom
2018-05-14 15:27:31 +08:00
SELECT COUNT(uid) FROM answer WHERE uid=10;
zqguo
2018-05-14 15:27:38 +08:00
回答 count(1)的认真看过题主的问题吗?
tianzx
2018-05-14 16:08:19 +08:00
m

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/454696

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX