2022-10-27 369
基本职场上的程序员用来统计数据库表的行数都会使用count(*),count(1)或者count(主键),那么它们之间的区别和性能你又是否了解呢?
其实程序员在开发的过程中,在一张大表上统计总行数是非常耗时的一个操作,那么我们应该用哪个方法统计会更快呢?
接下来我们就来聊一聊MySQL中统计总行数的方法和性能。
1、建表并且插入1000万条数据进行实验测试:
#创建测试表 CREATETABLE`t6`( `id`int(11)NOTNULLAUTO_INCREMENT, `name`varchar(50)NOTNULL, `status`tinyint(4)NOTNULL, PRIMARYKEY(`id`), KEY`idx_status`(`status`) )ENGINE=InnoDBDEFAULTCHARSET=utf8; #创建存储过程插入1000w数据 CREATEPROCEDUREinsert_1000w() BEGIN DECLAREiINT; SETi=1; WHILEi<=10000000DO INSERTINTOt6(name,status)VALUES('god-jiang-666',1); SETi=i+1; ENDWHILE; END; #调用存储过程,插入1000万行数据 callinsert_1000w();
2、分析实验结果
#花了0.572秒 selectcount(*)fromt6;
在这里插入图片描述
#花了0.572秒 selectcount(1)fromt6;
#花了0.580秒 selectcount(id)fromt6;
#花了0.620秒 selectcount(*)fromt6forceindex(primary);
从上面的实验我们可以得出,count(*)和count(1)是最快的,其次是count(id),最慢的是count使用了强制主键的情况。
下面我们继续测试一下它们各自的执行计划:
explainselectcount(*)fromt6; showwarnings;
explainselectcount(1)fromt6; showwarnings;
explainselectcount(id)fromt6; showwarnings;
explainselectcount(*)fromt6forceindex(primary); showwarnings;
从上面的实验可以得出这三点:
这个idx_status就是相当于是二级辅助索引树,目的就是为了说明:InnoDB在处理count(*)的时候,有辅助索引树的情况下,会优先选择辅助索引树来统计总行数。
为了验证count(*)会优先选择辅助索引树这个结论,我们继续来看看下面的实验:
#删除idx_status索引,继续执行count(*) altertablet6dropindexidx_status; explainselectcount(*)fromt6;
从以上实验可以得出,删除了idx_status这个辅助索引树,count(*)就会选择走主键索引。所以结论:count(*)会优先选择辅助索引,假如没有辅助索引的存在,就会走主键索引。
在MySQL5.7.18之前,InnoDB通过扫描聚集索引来处理count(*)语句。
从MySQL5.7.18开始,InnoDB通过遍历最小的可用二级索引来处理count(*)语句。如果不存在二级索引,则扫描聚集索引。
新版本为何会使用二级索引来处理count(*)呢?
因为InnoDB二级索引树的叶子节点上存放的是主键,而主键索引树的叶子节点存放的是整行数据,所以二级索引树比主键索引树小。因此查询优化器基于成本考虑,优先选择的是二级索引。所以索引count(*)快于count(主键)。
这篇文章的结论就是count(*)=count(1)>count(id)。
为什么count(id)走了主键索引还会更慢呢?因为count(id)需要取出主键,然后判断不为空,再累加,代价更高。
count(*)是会总计出所有NOT NULL和NULL的字段,而count(id)是不会统计NULL字段的,所以我们在建表的尽量使用NOT NULL并且给它一个默认是空即可。
最后,在以后总计数据库表的总行数的时候,可以大胆的使用count(*)或者count(1)。
原文链接:https://77isp.com/post/10391.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态