南京网站设计是什么,兴义做网站的,社交软件,网站登录界面模板htmlselect count(*) 应该是一个比较常用的语句#xff0c;用来统计记录行数。但是#xff0c;慢慢地你会发现#xff0c;这个语句越来越慢了#xff0c;为什么呢#xff1f;count(*) 的实现方式首先#xff0c;我们来看下它的实现方式。MySQL 中#xff0c;不同的存储引擎用来统计记录行数。但是慢慢地你会发现这个语句越来越慢了为什么呢count(*) 的实现方式首先我们来看下它的实现方式。MySQL 中不同的存储引擎count(*) 的实现方式是不同的。1、MyISAM 引擎比较简单粗暴直接将表的总行数存储在磁盘上因此效率很高2、InnoDB 引擎中执行时需要一行行的把数据查出来然后累加为啥 MyISAM 就可以这样做呢因为它不支持事务啊不用担心数据不一致的问题。而 InnoDB 就不一样了。由于 MVCC 的存在InnoDB 在当前执行环境下对一共有多少数据行是不确定的比如假设表 t 中有 1000 条数据有下面三个用户并行的会话1、A 启动事务查询表的总行数 2、C 直接插入一条数据然后查询总行数 3、B 启动事务插入一条数据然后查询总行数 4、C 查询总行数注意上面启动的事务都没有提交。imageA、B、C 查询的结果都不相同。B 读到的是 1002是因为可重复读隔离级别的存在而 C 未开启事务因此无法看到别的事务的更新综上InnoDB 引擎中在每一个会话中都需要逐行读取数据然后计数返回总行数。InnoDB 对 count(*) 的优化InnoDB 中主键索引存储的是数据辅助索引存储的只是主键值。因此辅助索引比主键索引小得多轻量得多。这种情况下InnoDB 在执行 count(*) 时就会判断使用哪个索引会选择最小的树来进行遍历。在保证逻辑正确的前提下尽量减少扫描的数据量是数据库系统设计的通用法则之一。小结1、由于 MyISAM 引擎不需要支持事务因此可以快速返回 count(*) 2、show table status 命令虽然返回很快但是不准确 3、InnoDB 执行 count(*) 时会遍历全表因此性能较差count(*)、count(1)、count(主键)、count(字段)的区别以下基于 InnoDB。含义区别count() 是一个聚合函数对于返回的结果集会逐行判断若返回的不是 NULL就会加 1否则不加。因此count(*)、count(主键 id) 和 count(1) 都表示返回满足条件的结果集的总行数而 count(字段则表示返回满足条件的数据行里面参数“字段”不为 NULL 的总个数。性能区别分析性能考虑以下几个原则1、server 层要什么就会返回什么 2、InnoDB 只返回必要的值 3、优化器只优化了 count(*)对于 count(主键id)InnoDB 会遍历全表取每行的主键 id返回给 server 层server 层拿到数据后进行判断累加。对于 count(1)InnoDB 仍遍历全表但是不取值server 层对返回的每一行数据新增一个 1然后进行判断累加因此count(1) 要更快些因为无需取值。从引擎返回 id 会涉及到解析数据行以及拷贝字段值的操作。对于 count(字段)1、如果这个“字段”是定义为 not null 的话一行行地从记录里面读出这个字段判断不能为 null按行累加2、如果这个“字段”定义允许为 null那么执行的时候判断到有可能是 null还要把值取出来再判断一下不是 null 才累加。但是 count(*) 是例外并不会把全部字段取出来而是专门做了优化不取值。count(*) 肯定不是 null按行累加。结论按照效率排序的话count(字段)count(主键 id)count(1)≈count(*)所以我建议你尽量使用 count(*)。作者hoxis链接https://www.jianshu.com/p/40b6ead97aa0来源简书简书著作权归作者所有任何形式的转载都请联系作者获得授权并注明出处。