MySQL不同的count函数效率

本文探讨了InnoDB和MyISAM引擎下count()函数的效率差异,MyISAM能快速返回行数,而InnoDB因MVCC需全表扫描。针对InnoDB的count()慢问题,提出了两种优化方案:使用缓存计数器(可能带来数据一致性风险)和创建单独计数表。此外,还比较了count(*)、count(1)、count(id)和count(字段)的效率,指出count(*)和count(1)最优。
摘要由CSDN通过智能技术生成

不同引擎下的count()函数

对于innodb引擎,count()函数的效率是O(N),走的是全表扫描,对于myIsam引擎,查询的时间复杂度是O(1),myisam引擎把一个表的总行数写在了磁盘上。因为innodb要支持MVCC,所以innodb需要返回多少行是不确定的

当然前面所说的是针对没有过滤条件的语句,对于有过滤条件的语句,myIsam也不能这么快

innodb引擎解决count()慢的方法

  • 利用缓存做一个计数器

    当我们第一次查询的时候,就将count()得到的结果放到缓存中,比如redis,然后在我们向表中插入数据或者删除数据的前/后进行redis中计数器的更新即可,这样就能够直接从缓存中获得count()的值了。但是这种方式由于更新redis和更新MySQL不是在同一个库中,所以可能存在数据逻辑不一致的问题,同时redis是内存数据库,redis崩溃也可能会导致数据丢失的问题

  • 在mysql中专门建立一个表存储计数器字段

    每次进行增加或删除数据时同样对计数表进行相应的增加或者删除,由于操作同样在数据库中,这是我们可以利用数据库的事务来保证数据逻辑的一致性

不同count()函数的效率对比

count()共有以下几个函数count(*),count(1),count(字段),count(id)

count(字段)函数在计算时,会出现字段为null的情况,这时就不计算该行

count()函数的执行有以下原则:

  • server层需要什么就给什么

  • innodb值提供必要的值

  • 目前的优化器只优化了count(*)的语义是取行数,其他的语义没有做优化

count(字段/id) innodb都会将字段和id返回给server,由server进行判断,不为空则行数+1

count(1/*) innodb只会将扫描到的行返回,server直接执行行数+1

效率:count(*) = count(1) > count(id) > count(字段)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值