2010年11月17日 星期三

Mysql中count(*),DISTINCT的使用方法和效率研究

在處理一個大數據量數據庫的時候
突然發現mysql對於count(*)的不同處理會造成不同的結果

比如執行
SELECT count(*) FROM tablename
即使對於千萬級別的數據mysql也能非常迅速的返回結果
而對於
SELECT count(*) FROM tablename WHERE…..
mysql的查詢時間開始攀升

仔細查閱累下手冊,發現當沒有WHERE語句對於整個mysql的表進行count運算的時候
MyISAM類型的表中保存有總的行數,而當添加有WHERE限定語句的時候Mysql需要對整個表進行檢索
從而得出count的數值

突然又想起來看到的不少新興的php程序對於count的處理並沒有很好的意識到這點
記錄下

順便提下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都相同的才被排除了,與我們期望的結果不一樣

4.這時候可以考慮使用group_concat函數來進行排除,不過這個mysql函數是在mysql4.1以上才支持的

5.其實還有另外一種解決方式,就是使用
SELECT id, type, count(DISTINCT id) FROM tablename
雖然這樣的返回結果多了一列無用的count數據(或許你就需要這個我說的無用數據)
返回的結果是只有id不同的所有結果和上面的4類型可以互補使用,就是看你需要什麼樣的數據了

PS:
越來越發現有很多細節是需要去探究的,
越來越發現自己寫文字真的很雜亂,
有空研究下DISTINCT的效率


轉載自http://www.ccvita.com/156.html

沒有留言:

張貼留言