mysql 七 count 統計方式的不同

2021-09-25 07:51:52 字數 1103 閱讀 7246

count(*)的實現方式:

在不同的mysql引擎中,count()實現的方式不同。

· myisam引擎中把乙個表的總行數直接存在了磁碟上,執行count() 的時候直接返回這個數,效率很高;(不支援事務)

· 而innodb引擎,執行count(*)的時候,需要把資料一行一行的從引擎讀出來,然後累計計數;(因為mvcc的實現,應該返回多少行是不確定的(自己能讀到自己事務的未提交記錄,而不能讀到別人事務的未提交記錄))

但是innodb在執行count()是做了優化的。

innodb是索引組織表,主鍵索引樹的葉子節點是資料,而普通索引樹的葉子節點是主鍵值。所以,普通索引樹比主鍵索引樹小很多。對於count()這個操作,遍歷哪個索引樹得到的結果邏輯上是一樣的,所以mysql優化器會選擇最小的那棵樹來遍歷。

在保證邏輯正確的前提下,儘量減少掃瞄的資料量,是資料庫系統設計的通用法則之一。

count() 對於返回的結果集,一行行的判斷,如果count函式的引數不是null,累計值就加1,最後返回累加值。

server層要什麼,innodb就返回什麼。(就是sql語句要什麼字段,innodb就返回什麼字段)

count(字段) 則表示返回滿足條件的資料行裡面,字段值不為null的總個數。

count(主鍵id): innodb引擎會遍歷整張表,把每一行的id取出來,返回給server層。server層拿到id後,判斷是不可能為空的,就按行累加。

count(1): innodb引擎會遍歷整張表,但不取值。server層對於返回的每一行,放乙個數字"1"進去,判斷是不可能為空的,按行累加。

count(字段):

1.如果字段定義為not null的話,一行行的從記錄裡面讀出這個字段,判斷不能為null,按行累加;

2.如果字段定義允許為null,執行的時候判斷到有可能是null,還要把值取出來再判斷一下,不是null才累加。

count(): 這個是個特例,並不會全部字段取出來返回,做了特殊的優化,不取值。count()肯定不是null,直接按行累加。

結果: count(*)≈count(1)>count(主鍵id)>count(字段)。

MySQL中count 的條件統計方式

前幾天做筆試題時遇到乙個問題,如下 乙個info表內容如下 date result 2019 10 12 high 2019 10 12 low2019 10 12 high 2019 10 16 low2019 10 16 low2019 10 16 high 請寫出相應的sql語句,以得出以下的...

mysql中的count統計操作

如果我們僅僅是統計 某錶的總共多少條 假設是innodb引擎,不考慮myisam 那麼很簡單 一 假設我們的表字段是這樣的 假設表名是users id 主鍵 自增 username 使用者名稱 varchar 50 那麼select count from users 不可置疑肯定是可以的。我們exp...

Mysql中使用count加條件統計

mysql中count 函式的一般用法是統計欄位非空的記錄數,所以可以利用這個特點來進行條件統計,注意這裡如果欄位是null就不會統計,但是false是會被統計到的,記住這一點,我們接下來看看幾種常見的條件統計寫法。測試環境 windows 10 welcome to the mysql monit...