mysql - 为什么count(*)快于count(id)
天蓬老师
天蓬老师 2017-04-17 13:51:37
[MySQL讨论组]

线上的一个大表(ENGINE=InnoDB) 接近5000万条记录 比较count(*)count(id)的查询时间 发现count(*)要明显优于count(id) 如下所示
不带where条件

select count(id) from op_log;
+-----------+
| count(id) |
+-----------+
|  49011955 |
+-----------+
1 row in set (12.46 sec)
select count(*) from op_log;
+----------+
| count(*) |
+----------+
| 49011982 |
+----------+
1 row in set (10.28 sec)

并且这一结果是可重复的
带where条件的情况下的两者比较

select count(id) from op_log where is_availability=1;
+-----------+
| count(id) |
+-----------+
|  49012832 |
+-----------+
1 row in set (17.29 sec)
select count(*) from op_log where is_availability=1;
+----------+
| count(*) |
+----------+
| 49012901 |
+----------+
1 row in set (16.57 sec)

仍然count(*)快于count(id) is_availability是一个索引: KEY is_availability (is_availability,is_del)

想知道为什么count(*)要优于count(id) 两者有什么区别?官方文档也没提到原因。
使用的数据库版本 5.6.21-1~dotdeb.1-log
其他补充信息

SHOW VARIABLES LIKE 'storage_engine';
+----------------+--------+
| Variable_name  | Value  |
+----------------+--------+
| storage_engine | InnoDB |
+----------------+--------+
show create table op_log\G
) ENGINE=InnoDB AUTO_INCREMENT=49037362 DEFAULT CHARSET=utf8
天蓬老师
天蓬老师

欢迎选择我的课程,让我们一起见证您的进步~~

全部回复(2)
巴扎黑

说明存储引擎先

PHPz

简单来说 count(*) 只有在MyISAM引擎下才优于 count(id). 因为MyISAM本身存储了row count.

SELECT COUNT(*) FROM db.table 相当于 SELECT table_rows FROM information_schema.table WHERE table_schema = 'db' AND table_name = 'table'
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号