怎么建设一个公司网站,wordpress 备案信息修改,绿色商城网站模板,网站公司成功案例怎么写Mysql count的原理你真的了解吗#xff1f;1、数据库引擎的区别2、InnoDB中count的使用3、innodb对select(\*)的优化/为什么select(\*)通过非聚集索引效率要高于聚集索引面试问到说“你觉得count(*) 的效率怎么样#xff1f;”#xff0c;一般回复innodb对count(*)进行优化后…
Mysql count的原理你真的了解吗1、数据库引擎的区别2、InnoDB中count的使用3、innodb对select(\*)的优化/为什么select(\*)通过非聚集索引效率要高于聚集索引面试问到说“你觉得count(*) 的效率怎么样”一般回复innodb对count(*)进行优化后效率显著提升所以count(*)效率是最高的但是面试官可能觉得你掌握情况一般
1、数据库引擎的区别
MyISAM 引擎把一个表的总行数存在了磁盘上因此执行 count(*) 的时候会直接返回这个数效率很高 但是如果是带条件的countMyISAM也慢。
InnoDB 引擎就麻烦了它执行 count(*) 的时候需要把数据一行一行地从引擎里面读出来然后累积计数。
2、InnoDB中count的使用
count的查询效率如下 count(普通字段) count(主键) count(*) ≈ count(1)
使用count的目的就是计算非空行数如果使用的是普通字段需要去判断该字段是否不为空然后再去累计行数而主键具备非空约束可直接累计行数注意count(字段)都需要去遍历一整张表然后将其中的字段取出来按行进行累加
而count(1) 也会去遍历整张表但不会取数据会放数字进去然后按行进行累加。
count(1)跟count(*)遍历整张表都不需要取字段减少返回给服务器的操作直接按行累加所以它们的速度会比使用字段要快
3、innodb对select(*)的优化/为什么select(*)通过非聚集索引效率要高于聚集索引
count(字段非聚集索引)的索引结构叶子节点保存的是部分字段会比count(主键聚集索引叶子节点保存的是row数据)那么count(字段)遍历整张表要快的多
之所以快是由于查询所访问的数据只占表的很小部分如果访问的数据多了那反而不如通过表扫描来得快因为扫描用的是顺序IO效率更高比运用随机IO访问大量数据的效率高很多is null 这种二义性查询索引失效的情况所以通过非聚集索引提升count(*) 的查询速度的本质在于非聚集索引所占空间的大小往往远小于聚集索引或堆表所占用的空间大小
并且Mysql优化器会主动找到最小的索引数来遍历保证逻辑正确的前提下尽量减少扫描的数据量。
但是这个结论也不完全正常如果非聚集索引的字段很长或者说是联合索引那可能效果会适得其反。
以上便是Mysql count(*)的使用原理以及InnoDb的优化策略的全部内容如果有解读不当欢迎在评论区指出