国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

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

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

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 日韩中文字幕免费视频 | 中文字幕一级 | 人人超碰免费 | 男女免费视频 | 岛国搬运工av在线播放 | 毛片视频免费播放 | 1000部精品久久久久久久久 | 日韩视频中文字幕 | 成人国产精品久久久 | 欧美精品亚洲精品 | 国产精品成人3p一区二区三区 | 欧美激情一区二区三级高清视频 | 亚洲国产一区二区在线观看 | 亚洲欧美国产精品专区久久 | 成人在线视频免费观看 | 日韩中文字幕在线免费观看 | 国产中文一区 | 丁香五月网久久综合 | 电影一级毛片 | 久久久久九九九九九 | 在线观看亚洲免费视频 | 午夜精品一区二区三区免费视频 | 日本中文字幕在线观看 | 国产欧美在线 | 国产午夜精品一区二区三区视频 | 中文字幕在线精品 | 天天操天天碰 | 四虎网址 | 久久精品久久久久久 | 欧美日韩精品一区 | 奇米久久| 自由成熟xxxx色视频 | 成人在线视频网站 | 亚洲精品久久久久中文字幕欢迎你 | 中文字幕在线免费 | 日韩电影中文字幕 | 毛片在线视频 | 日韩欧美一二三区 | 亚洲欧美在线一区 | 中文字幕在线观看不卡视频 | 日本丶国产丶欧美色综合 |