于是我改成了count(1)、count(id),然而都不行。
网上资料说MySQL对count(*)做了特别的优化,按理来说应该是最快的,然而三个都不约而同的非常慢。
解决方案是,为ID加了个唯一键:
之后再使用count(*)便能正常查询了:
对于这个问题的原因,依旧没能想明白为什么。欢迎大家相互讨论~
优化总结:1.任何情况下SELECT COUNT(*) FROM xxx 是最优选择;
2.尽量减少SELECT COUNT(*) FROM xxx WHERE COL = ‘xxx’ 这种查询;
3.杜绝SELECT COUNT(COL) FROM tablename WHERE COL = ‘xxx’ 的出现。(其中COL非主键)
环境:
MySQL版本:5.0.45
OS:Windows XP SP3
数据表一:sphinx
+———-+——————+——+—–+———+—————-+
| Field| Type | Null | Key | Default | Extra |
+———-+——————+——+—–+———+—————-+
| id | int(10) unsigned | NO | PRI | NULL| auto_increment |
| til | varchar(100) | NO | | ||
| content | text | NO | | ||
| dataline | int(11) | NO | | ||
+———-+——————+——+—–+———+—————-+
记录数:1120100
查询一:
mysql>select count(*) as totalnum from sphinx
+———-+
| totalnum |
+———-+
| 1120100 |
+———-+
1 row in set (0.00 sec)
查询二:
mysql>select count(*) as totalnum from sphinx where id>1000
+———-+
| totalnum |
+———-+
| 1119100 |
+———-+
1 row in set (2.17 sec)
查询三:
mysql>select count(*) as totalnum from sphinx where id>1000
+———-+
| totalnum |
+———-+
| 1119100 |
+———-+
1 row in set (0.61 sec)
查询四:
mysql>select count(*) as totalnum from sphinx where id>1000
+———-+
| totalnum |
+———-+
| 1119100 |
+———-+
1 row in set (0.61 sec)
查询五:
mysql>select count(id) as totalnum from sphinx
+———-+
| totalnum |
+———-+
| 1120100 |
+———-+
1 row in set (0.00 sec)
查询六:
mysql>select count(til) as totalnum from sphinx where id>1000
+———-+
| totalnum |
+———-+
| 1119100 |
+———-+
1 row in set (1 min 38.61 sec)
查询七:
mysql>select count(id) as totalnum from sphinx where id>11000
+———-+
| totalnum |
+———-+
| 1109100 |
+———-+
1 row in set (0.61 sec)
查询八:
mysql>select count(id) as totalnum from sphinx
+———-+
| totalnum |
+———-+
| 1120100 |
+———-+
1 row in set (0.03 sec)
结论:
在 select count() 没有 where 条件的时候 select count(*) 和 select count(col) 所消耗的查询时间相差无几。
在 select count() 有 where 条件的时候 select count(col) 所消耗的查询时间 比 select count(*) 明显多出数量级的时间。
欢迎转载,本文标题:MySQL count(*) 与 count(col) 查询效率比较
转载请注明原文网址:http://zz.dsidc.cn/html/shujuku/MYSQL/2014/0209/9478.html
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)