MySQL中count(*)与count(1)哪个更快
创始人
2024-11-21 02:22:18
0次

count(*),count(1),count(主键)哪个更快?

1、建表并且插入1000万条数据进行实验测试:

# 创建测试表
CREATE TABLE `t6` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(50) NOT NULL,
 `status` tinyint(4) NOT NULL,
 PRIMARY KEY (`id`),
 KEY `idx_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

# 创建存储过程插入1000w数据
CREATE PROCEDURE insert_1000w()
BEGIN
  DECLARE i INT;
  SET i=1;
  WHILE i<=10000000 DO
    INSERT INTO t6(name,status) VALUES('god-jiang-666',1);
    SET i=i+1;
  END WHILE;
END;

#调用存储过程,插入1000万行数据
call insert_1000w();

2、分析实验结果

# 花了0.572秒
select count(*) from t6;

MySQL中count(*)与count(1)哪个更快

# 花了0.572秒
select count(1) from t6;

MySQL中count(*)与count(1)哪个更快

# 花了0.580秒
select count(id) from t6;

MySQL中count(*)与count(1)哪个更快

# 花了0.620秒
select count(*) from t6 force index (primary);

MySQL中count(*)与count(1)哪个更快

从上面的实验我们可以得出,count(*)和count(1)是最快的,其次是count(id),最慢的是count使用了强制主键的情况。

下面我们继续测试一下它们各自的执行计划:

explain select count(*) from t6;
show warnings;

MySQL中count(*)与count(1)哪个更快

MySQL中count(*)与count(1)哪个更快

explain select count(1) from t6;
show warnings;

MySQL中count(*)与count(1)哪个更快

MySQL中count(*)与count(1)哪个更快

explain select count(id) from t6;
show warnings;

MySQL中count(*)与count(1)哪个更快

MySQL中count(*)与count(1)哪个更快

explain select count(*) from t6 force index (primary);
show warnings;

MySQL中count(*)与count(1)哪个更快

MySQL中count(*)与count(1)哪个更快

从上面的实验可以得出这三点:

  1. count(*)被MySQL查询优化器改写成了count(0),并选择了idx_status索引

  2. count(1)和count(id)都选择了idx_statux索引

  3. 加了force index(primary)之后,走了强制索引

这个idx_status就是相当于是二级辅助索引树,目的就是为了说明: InnoDB在处理count(*)的时候,有辅助索引树的情况下,会优先选择辅助索引树来统计总行数。

为了验证count(*)会优先选择辅助索引树这个结论,我们继续来看看下面的实验:

# 删除idx_status索引,继续执行count(*)
alter table t6 drop index idx_status;

explain select count(*) from t6;

MySQL中count(*)与count(1)哪个更快

从以上实验可以得出,删除了idx_status这个辅助索引树,count(*)就会选择走主键索引。所以结论:count(*)会优先选择辅助索引,假如没有辅助索引的存在,就会走主键索引。

为什么count(*)会优先选择辅助索引?

在MySQL5.7.18之前,InnoDB通过扫描聚集索引来处理count(*)语句。

从MySQL5.7.18开始,InnoDB通过遍历最小的可用二级索引来处理count(*)语句。如果不存在二级索引,则扫描聚集索引。

新版本为何会使用二级索引来处理count(*)呢?

因为InnoDB二级索引树的叶子节点上存放的是主键,而主键索引树的叶子节点存放的是整行数据,所以二级索引树比主键索引树小。因此查询优化器基于成本考虑,优先选择的是二级索引。所以索引count(*)快于count(主键)。

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...