中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

MySQL中count(1)、count(*)、count(字段)的區別有哪些

發布時間:2021-12-22 17:09:45 來源:億速云 閱讀:254 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“MySQL中count(1)、count(*)、count(字段)的區別有哪些”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“MySQL中count(1)、count(*)、count(字段)的區別有哪些”這篇文章吧。

    關于數據庫中行數統計,無論是MySQL還是Oracle,都有一個函數可以使用,那就是COUNT。

    但是,就是這個常用的COUNT函數,卻暗藏著很多玄機,尤其是在面試的時候,一不小心就會被虐。不信的話請嘗試回答下以下問題:

    > 1、COUNT有幾種用法?
    > 2、COUNT(字段名)和COUNT(*)的查詢結果有什么不同?
    > 3、COUNT(1)和COUNT(*)之間有什么不同?
    > 4、COUNT(1)和COUNT(*)之間的效率哪個更高?
    > 5、為什么《阿里巴巴Java開發手冊》建議使用COUNT(*)
    > 6、MySQL的MyISAM引擎對COUNT(*)做了哪些優化?
    > 7、MySQL的InnoDB引擎對COUNT(*)做了哪些優化?
    > 8、上面提到的MySQL對COUNT(*)做的優化,有一個關鍵的前提是什么?
    > 9、SELECT COUNT(*) 的時候,加不加where條件有差別嗎?
    > 10、COUNT(*)、COUNT(1)和COUNT(字段名)的執行過程是怎樣的?
    以上10道題,如果可以全部準確無誤的回答的話,那說明你真的很了解COUNT函數了。

    1.初識COUNT

    1、COUNT(expr) ,返回SELECT語句檢索的行中expr的值不為NULL的數量。結果是一個BIGINT值。

    2、如果查詢結果沒有命中任何記錄,則返回0

    3、但是,值得注意的是,COUNT(*) 的統計結果中,會包含值為NULL的行數。

    除了COUNT(id)和COUNT(*)以外,還可以使用COUNT(常量)(如COUNT(1))來統計行數,那么這三條SQL語句有什么區別呢?到底哪種效率更高呢?為什么《阿里巴巴Java開發手冊》中強制要求不讓使用 COUNT(列名)或 COUNT(常量)來替代 COUNT(*)呢?

    2.COUNT(字段)、COUNT(常量)和COUNT(*)之間的區別

    COUNT(常量) 和 COUNT(*) 表示的是直接查詢符合條件的數據庫表的行數。

    而COUNT(列名)表示的是查詢符合條件的列的值不為NULL的行數。

    COUNT(*)是SQL92定義的標準統計行數的語法,因為是標準語法,所以MySQL數據庫進行過很多優化。

    SQL92,是數據庫的一個ANSI/ISO標準。它定義了一種語言(SQL)以及數據庫的行為(事務、隔離級別等)。

    3.COUNT(*)的優化

    MySQL主要使用2種執行引擎:

    • InnoDB引擎

    • MyISAM引擎

    MyISAM不支持事務,MyISAM中的鎖是表級鎖;而InnoDB支持事務,并且支持行級鎖。

    MyISAM

    MyISAM做了一個簡單的優化,把表的總行數單獨記錄下來,如果執行count(*)時可以直接返回,前提是不能有where條件。MyISAM是表級鎖,不會有并發的行操作,所以查到的結果是準確的。

    InnoDB

    InnoDB不能使用這種緩存操作,因為支持事務,大部分操作都是行級鎖,行可能被并行修改,那么緩存記錄不準確。

    但是,InnoDB還是針對COUNT(*)語句做了些優化的。

    通過低成本的索引進行掃表,而不關注表的具體內容。

    InnoDB中索引分為聚簇索引(主鍵索引)和非聚簇索引(非主鍵索引),聚簇索引的葉子節點中保存的是整行記錄,而非聚簇索引的葉子節點中保存的是該行記錄的主鍵的值。

    MySQL會優先選擇最小的非聚簇索引來掃表。

    優化的前提是查詢語句中不包含where條件和group by條件。

    4.COUNT(*)和COUNT(1)

    MySQL官方文檔這么說:

    InnoDB handles SELECT COUNT(*) and SELECT COUNT(1) operations in the same way. There is no performance difference.

    所以,對于count(1)和count(*),MySQL的優化是完全一樣的,根本不存在誰更快!

    但依舊建議使用count(*),因為這是SQL92定義的標準統計行數的語法。

    5.COUNT(字段)

    進行全表掃描,判斷指定字段的值是否為NULL,不為NULL則累加。

    性能比count(1)和count(*)慢。

    6.總結

    COUNT函數的用法,主要用于統計表行數。主要用法有COUNT(*)、COUNT(字段)和COUNT(1)。

    因為COUNT(*)是SQL92定義的標準統計行數的語法,所以MySQL對他進行了很多優化,MyISAM中會直接把表的總行數單獨記錄下來供COUNT(*)查詢,而InnoDB則會在掃表的時候選擇最小的索引來降低成本。當然,這些優化的前提都是沒有進行where和group的條件查詢。

    在InnoDB中COUNT(*)和COUNT(1)實現上沒有區別,而且效率一樣,但是COUNT(字段)需要進行字段的非NULL判斷,所以效率會低一些。

    因為COUNT(*)是SQL92定義的標準統計行數的語法,并且效率高,所以請直接使用COUNT(*)查詢表的行數!

    以上是“MySQL中count(1)、count(*)、count(字段)的區別有哪些”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    乌拉特前旗| 射洪县| 获嘉县| 临西县| 扬中市| 郁南县| 长沙县| 涡阳县| 延寿县| 钦州市| 鹿邑县| 保德县| 琼结县| 卢湾区| 衡山县| 富蕴县| 胶州市| 陕西省| 南靖县| 城步| 漠河县| 陆河县| 正定县| 社旗县| 三穗县| 黄陵县| 马龙县| 乌什县| 新竹县| 新民市| 甘孜| 金沙县| 沙坪坝区| 长寿区| 义马市| 建阳市| 苏尼特左旗| 平罗县| 绥宁县| 长宁区| 金塔县|