2016-02-26 165 views
6

起初我想比較count(*)和count(id),哪個有更好的性能?爲什麼mysql count(*)比count更好(id)

MySQL版本

5.6.21-1~dotdeb.1-log 

表信息

PRIMARY KEY (`id`), 
KEY `is_availability` (`is_availability`,`is_del`) 
ENGINE=InnoDB AUTO_INCREMENT=48993819 DEFAULT CHARSET=utf8 
  1. 比較沒有where條件

    select count(*) from op_log; 
    +----------+ 
    | count(*) | 
    +----------+ 
    | 48989975 | 
    +----------+ 
    1 row in set (10.02 sec) 
    
    select count(id) from op_log ; 
    +-----------+ 
    | count(id) | 
    +-----------+ 
    | 48989990 | 
    +-----------+ 
    1 row in set (12.05 sec) 
    

count(*)優於count(id)

  • 比較WHERE條件

    select count(*) from op_log where is_availability=1; 
    +----------+ 
    | count(*) | 
    +----------+ 
    | 48990038 | 
    +----------+ 
    1 row in set (15.86 sec) 
    select count(id) from op_log where is_availability=1; 
    +-----------+ 
    | count(id) | 
    +-----------+ 
    | 48990096 | 
    +-----------+ 
    1 row in set (17.13 sec) 
    

    count(*)仍優於count(id)

  • 所以,如果我能得出這樣的結論count(*)count(id)有更好的性能,這是爲什麼?

    High Performance MySQL,我

    如果MySQL知道一些山坳不能爲NULL,這將優化計數(COL)到COUNT(*)內部

    所以我懷疑是花費的時間更多的是用來做這個優化工作。

    +1

    如何'id'定義? – Matthew

    +1

    搜索是你的朋友:https://duckduckgo.com/?q=mysql+count+performance&t=ffsb - 這裏有很多博客文章。 – Augusto

    +1

    在mysql中可能有[whats faster,count(\ *)或count(table \ _field \ _name))的重複項?(http://stackoverflow.com/questions/7515531/whats-faster-count-or-counttable-field -name-in-mysql) – Augusto

    回答

    8

    通常COUNT(*)的性能會稍好一些。 COUNT(id)需要檢查是否id不是NULL它的工作。這意味着它需要讀取值(以及檢查NULL的小額開銷)。

    我認爲當id是一個集羣主鍵時,大多數數據庫中的時序都是相同的。但是,也許MySQL優化器不會妨礙NULL檢查,即使對於聲明爲NOT NULL的列也是如此。

    注意:在進行計時時,您必須非常小心地從冷藏緩存開始。在你的情況下,更快的查詢似乎是第一次運行,所以緩存似乎不能解釋性能差異。

    +0

    是的,從高性能MySQL,我得到了:「如果mysql知道某個col不能爲NULL,它會優化count(col)以在內部計數(*)。 所以我懷疑花費更多的時間是用來做這個優化工作的。 – zhuguowei

    4

    COUNT(*)會計算你的表

    COUNT(列)中的所有行只會計算你的表的非NULL的列。

    您可以檢查此article

    的事情是COUNT(*)查詢就可以使用覆蓋指數甚至在 計數(COL)不能。當然,您可以將索引擴展爲(i,val),並將 查詢再次覆蓋索引,但如果您無法更改查詢(即,它是第三方應用程序)或 大小寫,我將僅使用此解決方法 列名是在查詢中的原因,你真的需要計數非空值的 。

    0

    COUNT(*)失敗說1和0 this Fails say 1 and is 0

    所有是固定的,由第二表的計數IDS !!!

    enter image description here

    相關問題