日期:2014-05-16  浏览次数:20732 次

[真伪]数据库中 select count(1) 比 select count(*) 快?
论坛上经常看到一种观点,就是 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(*) 哪个快不一定。

------解决方案--------------------
明天去公司测试一下
------解决方案--------------------
较高版本的数据库,c)
------解决方案--------------------
count(1) 指的是 count(第1列) 吧,而 count(*) 自己选择主键列统计。

count(1) 比 count(*) 是没有依据的,或许是因为有些人自认为的优化措施罢了!

SELECT * 与 COUNT(*) 这里的“*”完全是不同的意义!认为 COUNT(1) 比 COUNT(*) 快的人,肯定没有理解 SELECT * 与 COUNT(*) 中“*”表示的意义是不一样的!
------解决方案--------------------
探讨

count(1) 指的是 count(第1列) 吧,而 count(*) 自己选择主键列统计。

------解决方案--------------------
其实我一直想去看看数据库内部的实现 前提是等我有深厚的功底时

到时候这些问题就都知道了
------解决方案--------------------
公司不让用*,不知为什么,我也没弄懂,持续关注中!
------解决方案--------------------
count(主键)肯定是最优的方法之一,至于count(*),count(1)在oracle中有可能和count(pk)一样,可能比它慢,但是不能看比它快


其他数据库我不熟悉
------解决方案--------------------
路过,看一看
------解决方案--------------------
来学习的
------解决方案--------------------
没什么意义吧 不同得数据库有不同优化方法 如果有where条件得话则应该一样了
------解决方案--------------------
C。。。。
------解决方案--------------------
这个在公司好像讨论过这个问题,貌似select count(*)快一些。
------解决方案--------------------
这个我认为是差不多,当然没有测试也没有根据。所以我每次是看心情来用,有时1有时*
------解决方案--------------------
count(1),其实就是计算一共有多少符合条件的行。
1并不是表示第一个字段,而是表示一个固定值。
其实就可以想成表中有这么一个字段,这个字段就是固定值1,count(1),就是计算一共有多少个1.
同理,count(2),也可以,得到的值完全一样,count('x'),count('y')都是可以的。一样的理解方式。在你这个语句理都可以使用,返回的值完全是一样的。就是计数。
count(*),执行时会把星号翻译成字段的具体名字,效果也是一样的,不过多了一个翻译的动作,比固定值的方式效率稍微低一些。
百度知道里面看到的一个人的回答,希望对楼主有用
------解决方案--------------------
[code=SQL]mysql> use astar
Database changed
mysql> select count(*) from trans;
+----------+
| count(*) |
+----------+
| 542535 |
+----------+
1 row in set (0.41 sec)

mysql> Select count(1) from trans;
+----------+
| count(1) |
+----------+
| 542535 |
+----------+
1 row in set (0.20 sec)

mysql> Select count(*) from transdetail;
+----------+
| count(*) |
+----------+
| 906699 |
+----------+
1 row in set (0.28 sec)

mysql> select count(1) from transdetail;
+----------+
| count(1) |
+----------+
| 906699 |
+----------+
1 row in set (0.30 sec)

mysql> select count(*) from transpayment;
+----------+
| count(*) |
+----------+
| 542505 |
+----------+
1 row in set (0.33 sec)

mysql> Select count(1) from transpayment;
+----------+
| count(1) |
+----------+
| 542505 |
+----------+
1 row in set (0.20 sec)