Mysql 不一樣的 count 區別

不一樣 count 的區別:

  count(*)、count(主鍵 id)和 count(1) 都表示返回知足條件的結果集的總行數;而 count(字 段), 則表示返回知足條件的數據行裏面,參數「字段」不爲 NULL 的總個數。性能

性能: 

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

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

  單看這兩個用法的差異的話,能對比出來,count(1)執行得要比 count(主鍵 id)快。由於 從引擎返回 id 會涉及到解析數據行,以及拷貝字段值的操做。server

  對於 count(字段)來講:排序

  1)若是這個「字段」是定義爲 not null 的話,一行行地從記錄裏面讀 出這個字段,判斷不能爲 null,按行累加;效率

  2)若是這個「字段」定義容許爲 null,那麼執行的時候,判斷到有多是 null,還要把值取 出來再判斷一下,不是 null 才累加。遍歷

也就是,server 層要什麼字段,InnoDB 就返回什麼字段。 可是 count(*)是例外,並不會把所有字段取出來,而是專門作了優化,不取值。count(*) 確定不是 null,按行累加。 看到這裏,你必定會說,優化器就不能本身判斷一下嗎,主鍵 id 確定非空啊,爲何 不能按照 count(*)來處理,多麼簡單的優化啊。固然,MySQL 專門針對這個語句進行優化, 也不是不能夠。可是這種須要專門優化的狀況太多了,並且 MySQL 已經優化過 count(*)了, 咱們直接使用這種用法就能夠了。 數據

結論: 

  因此結論是:按照效率排序的話,count(字段)<count(主鍵 id)<count(1)≈count(*)。co

相關文章
相關標籤/搜索