mysql count操作效率比较

在innodb引擎中:

在字段有索引情况下

count(*)≈count(1)>count(字段)>count(主键id)

字段有索引的情况下,其实这四种性能其实都差不多,非要抠细节的话,那就如果上面排名一样了。

先说count(主键id),去主键索引树扫描,判断不为null,然后计数加1;但是主键索引树的叶子节点是完整数据,扫描起来会比较慢;count(字段)是扫描二级索引,判断字段是否允许为空,然后计数加1,二级索引的叶子节点是只存了主键字段,那肯定是比完整数据占用空间少,所以count(字段)>count(主键id)。

但是其实count(主键id)并不一定是走主键索引树,explain可能会走二级索引树,因为mysql5.7以后会进行优化,用trace工具查看可以计算所有索引的cost成本,哪个成本低就走哪个索引,其实就是因为二级索引树存储的数据比主键索引树少。(mysql5.7版本)

所以count(字段)>count(主键id)这个比较也是在count(主键id)走主键索引树扫描才是这样。

再说下count(1),跟count(字段)执行过程类似,不过count(1)不需要取出字段统计(+1操作),判断不为空,然后用常量1做统计;count(字段)需要取出字段放入到一个缓存中,然后在做统计(+1操作)

所以 count(1)>count(字段)

count(*),其实跟count(1)差不多性能,并不需要全部字段取出来,mysql专门做了优化,不取值,按行累加,效率很高,所以,我们的误区:count(*)效率很低,其实并不是。

无字段索引情况下:

count(*)≈count(1)>count(主键id)>count(字段)

count(字段)没索引那肯定最慢了,其他差不多。

对于数据量大的情况下count其实都很慢。

可以用show table status 查看总行数预估值

 要么就自己维护,写到redis去累加,要么建个表累加到表字段中。

对于myisam引擎,在不带where条件情况下count效率很高,myisam存储引擎的表的总行数会被

mysql存储在磁盘上,查询不需要计算

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值