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

为什么select count(主键) from table xxx;比select count(*) from table xxx;效率要高?
我是个java程序员,以前做开发的时候,写sql查询的时候都是用select count(*) from table xxx;的啊,经理给我说,“count(*)的,改成count(主键)”!
为什么select count(主键) from table xxx;比select count(*) from table xxx;效率要高?

------解决方案--------------------
引用为什么select count(主键) from table xxx;比select count(*) from table xxx;效率要高?

------解决方案--------------------
一样 你当sql傻啊
------解决方案--------------------
在MySQL中,其实count(*)的性能更好。
通常count(*)与count(主键)等价,但是优于count(col),这里的col表示一个不是主键的字段。

为什么count(主键)和count(*)快呢,因为主键通常都会自动建立了相应的索引,有了所以的字段当然比没有索引的快一点。至于其他的,呵呵,我也不知道
------解决方案--------------------
你这个观念是完全错误的,你们经理也是很ox的 


1. count(*) 在MyISAM里是走常量的,因为MyISAM记录数有单独数据,count(xx)命令解析则和count(*)完全不同。
2. 你要搞清楚count(xx)是什么意思,例如字段 AA,count(AA)表示的是统计 AA 字段内 非 Null记录数。
3. 有人用count(1) 去代替 count(*) 这也是毫无意义的,因为至少从MySQL来说,count(*)是被优化过的,可以参考第一条。


以上 all,你滴明白?

------解决方案--------------------
查询效率也和数据表类型有关系,MyISAM表和InnerDB表都会有差别。
------解决方案--------------------
这里,希望能澄清一个概念。
1. count(PK) 和 count(*)结果是一样的,性能在目前绝大多数数据库的实现里头,也基本上是一样的。
如果有的DBMS笨到count(PK)始终使用索引扫描,而count(*)根据实际情况进行表扫描和索引扫描动态调整,则在表扫描的情况下,可能count(*)要快一些,这已经是历史了。

2. count(*) 和 count(非PK字段),
这个比较是没有意义的。
count(非PK字段)统计的是该字段值不为空的记录行的总行数。

因此count(非PK字段)并不总等于count(*)的值。两个查询的结果都不一定相等,比较时间又有什么意义呢。
------解决方案--------------------
建议你直接问你们经理。 或许他根本不懂,也只是听什么人说的。或者在其它某种数据库中或许有差别。
------解决方案--------------------
既然都一样, 那就听经理的, 改为主键, 获取他想移植到其他数据库