首頁 >資料庫 >mysql教程 >MySQL關於Count函數的用法差異總結

MySQL關於Count函數的用法差異總結

藏色散人
藏色散人轉載
2022-11-29 16:47:112002瀏覽

前言

大家好,MySQL關於Count你知道多少

統計的需求在我們日常開發中非常容易遇到了,MySQL也支援多種的運算的函數,

接下來我們來看看他們之間有什麼區別,以及他們是否存在一些坑。 【推薦學習:MySQL影片教學

count(*)、count(1)、count(id)的差異

count的意思:count() 是一個聚合函數,對於傳回的結果集,一行行地判斷,如果count 函數的參數不是NULL,累計值就加1,否則不加。最後傳回累計值。

count(欄位)比較特殊,則表示傳回滿足條件的資料行裡面,參數「欄位」不為NULL 的總個數

分析效能差異原則

  • server 層要什麼就給什麼;

  • InnoDB 只給必要的值;

  • 現在的優化器只優化了count(*) 的語義為“取行數”,其他“顯而易見”的優化並沒有做

範例:

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

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

count(字段),server要字段,就返回字段,如果字段為空,就不做統計,字段的值過大,都會造成效率低下。

效率排序

count(字段)<count(主键 id)<count(1)≈count(*)

#為什麼count(*)最快?

優化器做了工作,找到最小的數來遍歷。

InnoDB 是索引組織表,主鍵索引樹的葉子節點是數據,而普通索引樹的葉子節點是主鍵值。所以,普通索引樹比主鍵索引樹小很多。對於 count(*) 這樣的操作,遍歷哪一個索引樹得到的結果邏輯上都是一樣的。因此,MySQL 優化器會找到最小的那棵樹來遍歷。在確保邏輯正確的前提下,盡量減少掃描的資料量,是資料庫系統設計的通用法則之一。

關於NULL的幾個坑

// 数据中存在null值数据
select count(*) from audit_log a;
结果:1

select count(id) from audit_log a;
结果:0

我們看到count的結果不一致,記錄數應該是1,count(id)卻等於0

這是因為count(欄位)是不統計,欄位值為null的值

所以在欄位為非空白欄位的情況下,需要使用count(*)來解決這個問題。

count(*)小結

  • #MyISAM 表雖然count(*) 很快,但不支援交易;

  • show table status 指令雖然回傳很快,但不準確;

  • InnoDB 表直接count(*) 會遍歷全表,雖然結果準確,但會導致效能問題。

#

以上是MySQL關於Count函數的用法差異總結的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:csdn.net。如有侵權,請聯絡admin@php.cn刪除