sql 中count 在innodb 和myisam 表类型的查询快慢


在sql中经常会用到count(*) 或者不常用的count(‘列’),在innodb和myisam 的查询速度有多大,原理又是什么?
下面我们首先唠唠myisam和innodb主要区别
1).MyISAM是非事务安全型的,而InnoDB是事务安全型的。
2).MyISAM锁的粒度是表级,而InnoDB支持行级锁定。
3).MyISAM支持全文类型索引,而InnoDB不支持全文索引。
4).MyISAM相对简单,所以在效率上要优于InnoDB,小型应用可以考虑使用MyISAM。
5).MyISAM表是保存成文件的形式,在跨平台的数据转移中使用MyISAM存储会省去不少的麻烦。
6).InnoDB表比MyISAM表更安全

myisam 和 innodb中count(*)查询快慢原理
在myisam中count(*)查询,myisam引擎很容易获得总行数的统计。查询速度变得更快。因为myisam存储引擎已经存储了表的总行数。每次新增加一行,这个计数器就加1。也就是说,把表的总数缓存在索引中了。


注意一点

**:myisam存储引擎的表,count()速度快的也仅仅是不带where条件的count。这个想想容易理解的,因为你带了where限制条件,原来所以中缓存的表总数能够直接返回用吗?不能用。这个查询引擎也是需要根据where条件去表中扫描数据,进行统计返回的。

**:针对Innodb表,尽量不执行 SELECT COUNT() 语句,因为Innodb表没有类似MyISAM那样的内部计数器来记录表记录总量,执行这个操作将会全表扫描,速度很慢。所以呢,表的行数越多,扫描的时间就越多。当你表行数还是小数量的时候体会不出速度差距。比如百万也感觉不出明显。上千万就会很明显速度差别了。

下面是一个myisam和innodb的300万条数据count()查询的结果(不带where条件)
myisam:
在这里插入图片描述
查询结果时间:
在这里插入图片描述
innodb:
在这里插入图片描述
在这里插入图片描述
比较得知:myisam 中count(
) 不带where条件下较innodb快很多

那么带上where条件后查询速度会是怎样,下面通过实践来证明一下
myisam:
在这里插入图片描述
查询结果:
在这里插入图片描述
innodb:
在这里插入图片描述
查询结果:
在这里插入图片描述
所以,可根据自己的综合情况,来进行count(*) 的使用.

那么为什么count(*) 加where条件,同样是全表扫描myisam 比innodb查询要快勒?
because…
INNODB在做SELECT的时候,要维护的东西比MYISAM引擎多很多;
1)INNODB要缓存数据块,MYISAM只缓存索引块, 这中间还有换进换出的减少;
2)innodb寻址要映射到块,再到行,MYISAM 记录的直接是文件的OFFSET,定位比INNODB要快

写的可能不完善,欢迎大家指正,共同进步

-----------------------------------------------------------------------------------------------------行走的辛同学------------

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值