在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要快
写的可能不完善,欢迎大家指正,共同进步
-----------------------------------------------------------------------------------------------------行走的辛同学------------