亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

 更新時間:2021年12月22日 15:17:13   作者:Hider1214  
COUNT在數(shù)據(jù)庫行數(shù)統(tǒng)計中被廣泛使用,那么你知道MySQL count(1)、count(*)、count(字段)的區(qū)別嗎,本文就想的介紹一下,感興趣的可以了解一下

關(guān)于數(shù)據(jù)庫中行數(shù)統(tǒng)計,無論是MySQL還是Oracle,都有一個函數(shù)可以使用,那就是COUNT。

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

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

1.初識COUNT

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

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

3、但是,值得注意的是,COUNT(*) 的統(tǒng)計結(jié)果中,會包含值為NULL的行數(shù)。

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

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

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

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

COUNT(*)是SQL92定義的標準統(tǒng)計行數(shù)的語法,因為是標準語法,所以MySQL數(shù)據(jù)庫進行過很多優(yōu)化。

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

3.COUNT(*)的優(yōu)化

MySQL主要使用2種執(zhí)行引擎:

  • InnoDB引擎
  • MyISAM引擎

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

MyISAM

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

InnoDB

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

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

通過低成本的索引進行掃表,而不關(guān)注表的具體內(nèi)容。

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

MySQL會優(yōu)先選擇最小的非聚簇索引來掃表。

優(yōu)化的前提是查詢語句中不包含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的優(yōu)化是完全一樣的,根本不存在誰更快!

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

5.COUNT(字段)

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

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

6.總結(jié)

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

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

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

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

參考鏈接:MySQL的COUNT語句,竟然都能被面試官虐的這么慘???

到此這篇關(guān)于MySQL count(1)、count(*)、count(字段)的區(qū)別的文章就介紹到這了,更多相關(guān)MySQL count(1)、count(*)、count(字段)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MYSQL更新優(yōu)化實錄

    MYSQL更新優(yōu)化實錄

    本文給大家分享的是個人在對mysql數(shù)據(jù)進行刷新的時候遇到的一個效率非常低下的問題的解決全過程,主要是針對sql語句來進行優(yōu)化,有查找問題的方法,有解決方法,非常的詳細,小伙伴可以參考下。
    2015-08-08
  • CentOS下安裝MySQL5.6.10和安全配置教程詳解

    CentOS下安裝MySQL5.6.10和安全配置教程詳解

    這篇文章主要介紹了CentOS下安裝MySQL5.6.10和安全配置教的相關(guān)資料,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-12-12
  • MySQL百萬數(shù)據(jù)深度分頁優(yōu)化思路解析

    MySQL百萬數(shù)據(jù)深度分頁優(yōu)化思路解析

    這篇文章主要為大家介紹了MySQL百萬數(shù)據(jù)深度分頁優(yōu)化思路分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05
  • centos7下安裝mysql6初始化安裝密碼的方法

    centos7下安裝mysql6初始化安裝密碼的方法

    這篇文章主要介紹了centos7下安裝mysql6初始化安裝密碼的方法,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • 詳解MySQL like如何查詢包含''%''的字段(ESCAPE用法)

    詳解MySQL like如何查詢包含''%''的字段(ESCAPE用法)

    這篇文章主要介紹了詳解MySQL like如何查詢包含'%'的字段(ESCAPE用法),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-12-12
  • 遠程連接mysql數(shù)據(jù)庫注意事項記錄(遠程連接慢skip-name-resolve)

    遠程連接mysql數(shù)據(jù)庫注意事項記錄(遠程連接慢skip-name-resolve)

    有時候我們需要遠程連接mysql數(shù)據(jù)庫,就需要注意下面的問題,方便大家解決,腳本之家小編特為大家準備了一些資料
    2012-07-07
  • MySQL無法存儲Emoji表情問題的解決方法分析

    MySQL無法存儲Emoji表情問題的解決方法分析

    這篇文章主要介紹了MySQL無法存儲Emoji表情問題的解決方法,結(jié)合實例形式分析了存儲Emoji表情報錯的原因及相應(yīng)的解決方法,需要的朋友可以參考下
    2018-07-07
  • 淺談MySQL中用什么數(shù)據(jù)類型存IP地址

    淺談MySQL中用什么數(shù)據(jù)類型存IP地址

    MySQL中用什么數(shù)據(jù)類型存IP地址?在MySQL中,當存儲IPv4地址時,應(yīng)該使用32位的無符號整數(shù)來存儲IP地址,而不是使用字符串,本文就介紹一下這幾種情況,感興趣的可以了解一下
    2023-08-08
  • Mysql表連接的誤區(qū)與原理詳析

    Mysql表連接的誤區(qū)與原理詳析

    在使用MySQL數(shù)據(jù)庫過程中,left?join?基本是必用的語法,下面這篇文章主要給大家介紹了關(guān)于Mysql表連接的誤區(qū)與原理的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • MySQL怎么給字符串字段加索引

    MySQL怎么給字符串字段加索引

    本文主要介紹了MySQL怎么給字符串字段加索引,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-03-03

最新評論