关于Mysql的count统计

1、count()方法的目的是计算当前sql语句查询得到的非NULL的行数

2、使用 myisam引擎的数据表里有个记录当前表里有几行数据的字段,直接读这个字段返回就好了,因此速度快得飞起。

3、使用innodb引擎的数据表,则会选择体积最小的索引树,然后通过遍历叶子节点的个数挨个加起来,这样也能得到全表数据。

4、为什么innodb不能像myisam那样实现count()方法

innodb引擎通过MVCC实现了可重复隔离级别,事务开启后,多次执行同样的select快照读,要能读到同样的数据。

因此由于事务隔离级别的存在,不同的事务在同一时间下,看到的表内数据行数是不一致的,因此innodb,没办法,也没必要像myisam那样单纯的加个count字段信息在数据表上。

5、count方法的大原则是server层会从innodb存储引擎里读来一行行数据,并且只累计非null的值

6、性能排序

count(*) ≈ count(1) > count(主键id) > count(普通索引列) > count(未加索引列)

7、允许粗略估计行数的场景

可以把explain语句当做raw sql传入,从返回的结果里将rows那一列读出来使用。

一般情况下,explain的sql如果能走索引,那会比不走索引的情况更准 。单个字段的索引会比多个字段组成的复合索引要准。索引区分度越高,rows的值也会越准。

8、实时性没那么高的场景

如果有条件,这种场景最好的方式还是消费binlog将数据导入到hive里,然后在hive里做查询。

参考:

count(*)为什么会慢? 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值