Mysql count(*),DISTINCT效率研究

來源:互聯網
上載者:User

突然發現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類型可以互補使用,就是看你需要什麼樣的資料了

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.