最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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

1.初識(shí)COUNT

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

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

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

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

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

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

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

COUNT(*)是SQL92定義的標(biāo)準(zhǔn)統(tǒng)計(jì)行數(shù)的語(yǔ)法,因?yàn)槭菢?biāo)準(zhǔn)語(yǔ)法,所以MySQL數(shù)據(jù)庫(kù)進(jìn)行過很多優(yōu)化。

SQL92,是數(shù)據(jù)庫(kù)的一個(gè)ANSI/ISO標(biāo)準(zhǔn)。它定義了一種語(yǔ)言(SQL)以及數(shù)據(jù)庫(kù)的行為(事務(wù)、隔離級(jí)別等)。

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

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

  • InnoDB引擎
  • MyISAM引擎

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

MyISAM

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

InnoDB

InnoDB不能使用這種緩存操作,因?yàn)橹С质聞?wù),大部分操作都是行級(jí)鎖,行可能被并行修改,那么緩存記錄不準(zhǔn)確。

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

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

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

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

優(yōu)化的前提是查詢語(yǔ)句中不包含where條件和group by條件。

4.COUNT(*)和COUNT(1)

MySQL官方文檔這么說(shuō):

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

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

但依舊建議使用count(*),因?yàn)檫@是SQL92定義的標(biāo)準(zhǔn)統(tǒng)計(jì)行數(shù)的語(yǔ)法。

5.COUNT(字段)

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

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

6.總結(jié)

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

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

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

因?yàn)镃OUNT(*)是SQL92定義的標(biāo)準(zhǔn)統(tǒng)計(jì)行數(shù)的語(yǔ)法,并且效率高,所以請(qǐng)直接使用COUNT(*)查詢表的行數(shù)!

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

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

相關(guān)文章

  • mysql數(shù)據(jù)自增ID為2的解決方案

    mysql數(shù)據(jù)自增ID為2的解決方案

    這篇文章主要介紹了mysql數(shù)據(jù)自增ID為2的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • MacBook下python3.7安裝教程

    MacBook下python3.7安裝教程

    這篇文章主要為大家詳細(xì)介紹了MacBook下python3.7安裝教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-07-07
  • show engine innodb status顯示信息不全如何解決

    show engine innodb status顯示信息不全如何解決

    執(zhí)行 show engine innodb status\G 時(shí),顯示的信息不全,DEADLOCK相關(guān)信息太多,后面的都沒了
    2012-11-11
  • MYSQL根據(jù)JSON列將一行拆為多行的操作方法

    MYSQL根據(jù)JSON列將一行拆為多行的操作方法

    這篇文章主要介紹了MYSQL根據(jù)JSON列將一行拆為多行的操作方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • Mysql索引詳細(xì)介紹

    Mysql索引詳細(xì)介紹

    這篇文章主要介紹了Mysql索引詳細(xì)介紹,本文講解了Mysql索引簡(jiǎn)介、設(shè)計(jì)索引的原則、如何使用索引等內(nèi)容,需要的朋友可以參考下
    2014-07-07
  • MySQL中explain語(yǔ)句的基本使用教程

    MySQL中explain語(yǔ)句的基本使用教程

    這篇文章主要給大家介紹了關(guān)于MySQL中explain語(yǔ)句的基本使用教程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • MySQL創(chuàng)建橫向直方圖的解決方案

    MySQL創(chuàng)建橫向直方圖的解決方案

    這篇文章主要給大家介紹了關(guān)于MySQL創(chuàng)建橫向直方圖的解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • 解決Java程序使用MySQL時(shí)返回參數(shù)為亂碼的示例教程

    解決Java程序使用MySQL時(shí)返回參數(shù)為亂碼的示例教程

    這篇文章主要介紹了解決Java程序使用MySQL返回參數(shù)為亂碼的問題的教程,通過示例來(lái)講解utf-8編碼在MySQL中的相關(guān)配置,示例需要的朋友可以參考下
    2015-12-12
  • Mysql查詢優(yōu)化之IN子查詢優(yōu)化方法詳解

    Mysql查詢優(yōu)化之IN子查詢優(yōu)化方法詳解

    項(xiàng)目中有需要,使用MySQL的in子查詢,查詢符合in子查詢集合中條件的數(shù)據(jù),但是沒想到的是,MySQL的in子查詢會(huì)如此的慢,讓人無(wú)法接受,下面這篇文章主要給大家介紹了關(guān)于Mysql查詢優(yōu)化之IN子查詢優(yōu)化的相關(guān)資料,需要的朋友可以參考下
    2023-02-02
  • vs如何讀取mysql中的數(shù)據(jù)并解決中文亂碼問題

    vs如何讀取mysql中的數(shù)據(jù)并解決中文亂碼問題

    這篇文章主要介紹了vs如何讀取mysql中的數(shù)據(jù)并解決中文亂碼問題,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09

最新評(píng)論

定结县| 玛多县| 晋城| 夏邑县| 碌曲县| 金山区| 安康市| 罗平县| 黑山县| 凤冈县| 江孜县| 平安县| 东台市| 阳西县| 东宁县| 阿尔山市| 寿光市| 澎湖县| 遂平县| 华阴市| 兰溪市| 临沂市| 九龙坡区| 巫溪县| 丹凤县| 湘阴县| 梓潼县| 怀化市| 观塘区| 富民县| 讷河市| 揭西县| 舟山市| 嘉荫县| 大姚县| 嘉定区| 乐亭县| 平湖市| 中江县| 郑州市| 沧源|