[真伪]数据库中 select count(1) 比 select count(*) 快?

ACMAIN_CHM 2011-09-02 08:01:33
加精
论坛上经常看到一种观点,就是 select count(1) from table1 .. 比 select count(*) from table1 .. 要快。

看看大家什么观点,
估计大家都知道 select 1 from table1 肯定比 select * from table1 要快。但这个count(1) 与 count(*) 对比是如何呢?

发个贴子大家讨论讨论。

A) count(1) 快于 count(*)
B) count(1) 慢于 count(*)
C) count(1) 速度上等同于 count(*)
D) 说不准,count(1) count(*) 哪个快不一定。
...全文
9188 85 打赏 收藏 转发到动态 举报
写回复
用AI写文章
85 条回复
切换为时间正序
请发表友善的回复…
发表回复
fasdlkfjd 2014-01-03
  • 打赏
  • 举报
回复
看是什么存储引擎 , MYSQL 仅仅是实例而已 . 仅仅语句 select count(* OR UNIQUE COLUMN) FROM TBL(不能有 WHERE 条件) 对于 MYISAM 来说一样快 , WHY ? 因为 myisam 引擎在 analyze table 的时候保存了表的精确数据 . ( show table status\G 可见 ) count(唯一值字段) 时会被查询优化器转变为 count(*) , 而你的 count(1) 我想最终也会被转化为 count(*) 证据就是 : mysql> explain select count(*) from Sheet1; +----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+ | 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away | +----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+ 请看 Extra 列 , 意为使用缓存数据 请看 count(1) 的执行计划 : explain select count(1) from Sheet1; +----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+ | 1 | SIMPLE | NULL | NULL | NULL | NULL | NULL | NULL | NULL | Select tables optimized away | +----+-------------+-------+------+---------------+------+---------+------+------+------------------------------+ 依然使用已保存的数据 , 所以 除了 select_type 和 EXTRA 列其他都是空 , 未去任何 table 中查找任何数据 , 自然也谈不上 join_type 是全表扫描还是索引还是范围还是 REF 或者常量或是 SYSTEM . 自然可能的索引(possible_keys) 也没有任何索引 , 实际索引 ( key, key_len ) 等等等都为空 . 执行计划这么清楚明了 , 我想 , 既然都是使用已存储的数据 , 那么速度应该没有区别吧 ... 当然 , 苹果公司的 think different 教我们一定要有自己的观点 , 不然撸主来个基准测试 ? 用基准测试的结果作为证据让大家都信服一下 ?
woshipangshunlong 2013-12-04
  • 打赏
  • 举报
回复
mark~~~
ycltpe 2013-10-30
  • 打赏
  • 举报
回复
jinguanding 2011-10-18
  • 打赏
  • 举报
回复
COUNT(*) 和 COUNT(1)....性能是一样的,只是一个写法容易读懂,更具有可读性,另外一个优点像偏方...


#*********************#
技术网站:www.mysqlops.com
新浪微博:http://weibo.com/mysqlops
#*********************#
ldb2741 2011-10-18
  • 打赏
  • 举报
回复
一般情况下,两着返回结果是一样的

假如表沒有主键(Primary key), 那么count(1)比count(*)快

如果有主键的話,那主键作为count的条件时候count(主键)最快

如果你的表只有一个字段的话那count(*)就是最快的

count(*) 跟 count(1) 的结果一样,都包括对NULL的统计
count(column) 是不包括NULL的统计
minitoy 2011-10-17
  • 打赏
  • 举报
回复
感觉这种东西跟数据库本身的优化有关系,同一个数据库的不同版本可能结果都不一样。
态度决定品质 2011-10-17
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 lxq19851204 的回复:]

[code=SQL]mysql> use astar
Database changed
mysql> select count(*) from trans;
+----------+
| count(*) |
+----------+
| 542535 |
+----------+
1 row in set (0.41 sec)

mysql> Select count(……
[/Quote]这个测试数据和结论相反啊 不是我看错了吧
GIS_Cloud 2011-10-17
  • 打赏
  • 举报
回复
没有结果的讨论
zuoxingyu 2011-09-28
  • 打赏
  • 举报
回复
1200W记录下,MYISAM,count(*)=count(1)
路人乙e 2011-09-28
  • 打赏
  • 举报
回复
count(1) 是绝对快,它只统计记录条数,对条件下的表扫描一遍而已
count(*) 是可能快,有主键的时候只扫主键,主键数等于记录数
count(主键)=count(1)
wminjay 2011-09-27
  • 打赏
  • 举报
回复
一直以为count(*) 打遍天下无敌手呢
居然还有count(1)
无天 2011-09-25
  • 打赏
  • 举报
回复
这个。。。
态度决定品质 2011-09-23
  • 打赏
  • 举报
回复
答案是D吧

大家给的测试用例很给力
wuhen11987 2011-09-22
  • 打赏
  • 举报
回复
喜欢count(1)
宁波朱超 2011-09-22
  • 打赏
  • 举报
回复
15楼给的连接不是很清楚么!
萧炎 2011-09-17
  • 打赏
  • 举报
回复
----count(*)是整个表中有多少条记录,扫描的是整个表
而count(1)这种采用实际值的例子比用*都要快.因为它执行的时候不是扫描整个表
zgycsmb 2011-09-16
  • 打赏
  • 举报
回复
A) count(1) 快于 count(*)
同意这点,
不过没什么实际意义,只要不select * 就好,
接分。
就这么拽 2011-09-08
  • 打赏
  • 举报
回复
看啊看
StillMiss 2011-09-08
  • 打赏
  • 举报
回复
来学习下
程晨c 2011-09-07
  • 打赏
  • 举报
回复
SqlServer2000,答案是A,曾经遇到过这样的问题
加载更多回复(62)

56,679

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧