剛給一個朋友解決他寫的Discuz!插件的問題,說到MySQL的COUNT(*)的效率,發現越說越說不清楚,干脆寫下來,分享給大家.
COUNT(*)與COUNT(COL),網上搜索了下,發現各種說法都有.
比如認為COUNT(COL)比COUNT(*)快的,認為COUNT(*)比COUNT(COL)快的,還有朋友很搞笑的說到這個其實是看人品的.
在不加WHERE限制條件的情況下,COUNT(*)與COUNT(COL)基本可以認為是等價的,但是在有WHERE限制條件的情況下,COUNT(*)會比COUNT(COL)快非常多.
具體的數據參考如下:
- mysql> SELECT COUNT(*) FROM cdb_posts where fid = 604;
- +------------+
- | COUNT(fid) |
- +------------+
- | 79000 |
- +------------+
- 1 row in set (0.03 sec)
- mysql> SELECT COUNT(tid) FROM cdb_posts where fid = 604;
- +------------+
- | COUNT(tid) |
- +------------+
- | 79000 |
- +------------+
- 1 row in set (0.33 sec)
- mysql> SELECT COUNT(pid) FROM cdb_posts where fid = 604;
- +------------+ --Vevb.com
- | COUNT(pid) |
- +------------+
- | 79000 |
- +------------+
- 1 row in set (0.33 sec)
COUNT(*)通常是對主鍵進行索引掃描,而COUNT(COL)就不一定了,另外前者是統計表中的所有符合的紀錄總數,而后者是計算表中所有符合的COL的紀錄數。還有有區別的。
COUNT時的WHERE解決辦法
順便提下mysql的DISTINCT的關鍵字有很多你想不到的用處
1.在count 不重復的記錄的時候能用到,代碼如下:
SELECT COUNT( DISTINCT id ) FROM tablename;
就是計算talbebname表中id不同的記錄有多少條.
2,在需要返回記錄不同的id的具體值的時候可以用,代碼如下:
SELECT DISTINCT id FROM tablename;
返回talbebname表中不同的id的具體的值.
3.上面的情況2對于需要返回mysql表中2列以上的結果時會有歧義,代碼如下:
SELECT DISTINCT id, type FROM tablename;
實際上返回的是 id與type同時不相同的結果,也就是DISTINCT同時作用了兩個字段,必須得id與tyoe都相同的才被排除了,與我們期望的結果不一樣.
簡單說下,就是COUNT的時候,如果沒有WHERE限制的話,MySQL直接返回保存有總的行數,而在有WHERE限制的情況下,總是需要對MySQL進行全表遍歷.
優化總結,對于MyISAM表來說:
1.任何情況下SELECT COUNT(*) FROM tablename是最優選擇;
2.盡量減少SELECT COUNT(*) FROM tablename WHERE COL = 'value' 這種查詢;
3.杜絕SELECT COUNT(COL) FROM tablename WHERE COL2 = 'value' 的出現。
新聞熱點
疑難解答