一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - MySQL count(1)、count(*)、count(字段)的區別

MySQL count(1)、count(*)、count(字段)的區別

2022-02-12 20:02Hider1214 Mysql

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語句,竟然都能被面試官虐的這么慘!?

到此這篇關于MySQL count(1)、count(*)、count(字段)的區別的文章就介紹到這了,更多相關MySQL count(1)、count(*)、count(字段)內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/hider/p/11726690.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美女的隐私脱裤子无遮挡 | 成人男女网免费 | 免费精品在线 | 国产激情一区二区三区成人91 | 国产成人精品一区二区阿娇陈冠希 | 亚洲国产欧美目韩成人综合 | 亚洲欧美日韩在线观看看另类 | 亚洲国产美女精品久久久久 | 超级乱淫伦小说全集np | 欧美特黄特色aaa大片免费看 | 国产成人亚洲精品91专区高清 | 精品国产乱码久久久人妻 | 亚洲欧美成人中文在线网站 | 免费特黄一级欧美大片在线看 | 91尤物在线视频 | 国产亚洲欧美日韩综合综合二区 | 成年人在线视频免费观看 | 九九99热| 风间由美在线播放 | 国产女乱淫真高清免费视频 | 美女被绑着吸下部的故事 | asianfemdom冷柔女王 | 日本加勒比在线精品视频 | 欧洲喷浆乌克兰 | 北条麻妃一区 | 丰满在线观看 | 俄罗斯13一14处出血视频在线 | 日本网 | 亚洲va在线va天堂成人 | 国产99在线观看 | acg火影忍者熟密姬纲手h | 国产东北3p真实在线456视频 | tube69中国露脸 | 久久久无码精品亚洲A片软件 | 精品免费国产一区二区三区 | 国产免费好大好硬视频 | 秋葵污视频 | 好大好粗好舒服 | 欧美国产影院 | 91精品国产色综合久久 | 午夜亚洲一区二区福利 |