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

MySQL?count(*),count(id),count(1),count(字段)區(qū)別

 更新時(shí)間:2023年05月26日 16:08:05   作者:珍妮瑪?黛金  
本文主要介紹了MySQL?count(*),count(id),count(1),count(字段)區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

count

count 是MySQL的一個(gè)查詢數(shù)量統(tǒng)計(jì)的函數(shù),我們?cè)谄匠5墓ぷ髦薪?jīng)常會(huì)用到,count(*),count(id),count(1),count(字段)這4種寫法有什么區(qū)別呢?

//星號(hào)
select count(*) from user;
//常數(shù)
select count(1) from user;
//id(主鍵)
select count(id) from user;
//字段
select count(name) from user;

這幾種方式都可以查詢出user表的個(gè)數(shù),但是結(jié)果可能會(huì)不一樣,為什么呢?

思考

為什么《阿里巴巴Java開發(fā)手冊(cè)》中強(qiáng)制要求不讓使用 COUNT(列名)或 COUNT(常量)來替代COUNT(*)呢?

因?yàn)閏ount(*)是SQL92定義的標(biāo)準(zhǔn)統(tǒng)計(jì)行數(shù)的語法,

所以MySQL對(duì)他進(jìn)行了很多優(yōu)化,MyISAM中會(huì)直接把表的總行數(shù)單獨(dú)記錄下來供count(*)查詢,而InnoDB則會(huì)在掃表的時(shí)候選擇最小的索引來降低成本。當(dāng)然,這些優(yōu)化的前提都是沒有進(jìn)行where和group的條件查詢。

count執(zhí)行過程

根據(jù)mysql執(zhí)行引擎的不同,count的執(zhí)行過程也會(huì)不同,我們以count(*)為例來分別介紹二者的執(zhí)行原理。

  • MyISAM引擎:這個(gè)引擎最大的特點(diǎn)是不支持事務(wù),鎖的話是表級(jí)鎖,正是由于是表級(jí)鎖,針對(duì)表的操 作都需要串聯(lián)操作,不會(huì)出現(xiàn)兩個(gè)或多個(gè)執(zhí)行程序?qū)σ粡埍淼耐瑫r(shí)操作,也就是說表的行數(shù)是穩(wěn)定的,可維護(hù)的。針對(duì)count() 的操作,mysql自己了一個(gè)優(yōu)化,類似于維護(hù)一份元數(shù)據(jù)信息,專門用來記錄表的行數(shù),這樣每當(dāng)有count()查詢的時(shí)候就直接返回這個(gè)維護(hù)好的值,不需要再掃描全表了。所以它是一個(gè)O(1)復(fù)雜度的操作。
  • InnoDB引擎:支持事務(wù)支持行級(jí)鎖,行級(jí)鎖的特點(diǎn)是多個(gè)事務(wù)可以同時(shí)對(duì)一張表進(jìn)行讀寫,只要是不 同的行就行。但是這樣一來表的行數(shù)就會(huì)變化很快而不可維護(hù),mysql本身也就無法專門維護(hù)一個(gè)值去記錄表的行數(shù)了。所以針對(duì)count(*)的操作不得不掃描全表以返回一個(gè)準(zhǔn)確的結(jié)果。這是一個(gè)O(n)復(fù)雜度的操作。

優(yōu)化:雖然在InnoDB引擎下沒有一個(gè)直接返回的結(jié)果,但是隨著mysql版本的不斷升級(jí),官方還是做了許多優(yōu)化的,主要是索引上的優(yōu)化。從上面我們知道在這個(gè)引擎下不可避免的要掃描全表,所以我們也只能再掃描全面上下功夫。由于count(*)不關(guān)心具體的列,所以在掃描的過程中我們?nèi)绻梢赃x擇一個(gè)較低成本的索引的話就可以節(jié)省掃描的時(shí)間。在InnoDB中索引分為聚簇索引(主鍵索引)和非聚簇索引(非主鍵索引),聚簇索引的葉子節(jié)點(diǎn)中保存的是整行記錄,而非聚簇索引的葉子節(jié)點(diǎn)中保存的是該行記錄的主鍵的值。這種情況下是非聚簇索引要比聚簇索引小得多,所以在具體執(zhí)行的過程如果有非聚簇索引的活mysql會(huì)自動(dòng)選擇在非聚簇索引的列上做統(tǒng)計(jì),這樣就能提高查詢的速度。

備注:以上都是在SQL語句中沒有where和group by等限定條件下的查詢分析。

count(*)和count(1)的對(duì)比

首先這兩者的執(zhí)行結(jié)果是完全一致的,也可以把count(1)換成其他的數(shù)字如count(8)甚至是字符串如count(‘x’),都不會(huì)影響執(zhí)行的結(jié)果。但是針對(duì)二者的執(zhí)行過程,網(wǎng)上是眾說紛紜,一種主流的觀點(diǎn)是count()比count(1)快,原因是mysql針對(duì) count( )這種操作做了特殊的優(yōu)化;另外一種聲音是count(1)比count()快,因?yàn)閏ount()在執(zhí)行過程中會(huì)先轉(zhuǎn)為為count(1)然后在執(zhí)行,直接count(1)的話少了一步轉(zhuǎn)換操作,自然會(huì)快一些。那么哪種說更有道理呢?我們還是來看官方的說明:

意思就是說對(duì)于InnoDB引擎來說count(*)和count(1)的底層操作是一致,在優(yōu)化上是一致的,沒有差異。所以結(jié)論就是二者的執(zhí)行速度是一眼的,不存在孰優(yōu)孰劣的差異。

不過對(duì)于MyISAM引擎來說,只有第一列的值全部不為null的時(shí)候,count(1)才和count(*)擁有相同的執(zhí)行優(yōu)化。

count(id)和count(字段)的對(duì)比

查id 和查字段實(shí)際上是一樣的,都會(huì)查詢出非空數(shù)據(jù),并累加1,但是由于id是主鍵非空的,所以count(id) 的效率比count(字段)更快,count(字段)需要把判斷是否為null

count執(zhí)行結(jié)果

我們分別用這下列幾種情況測(cè)試下

  • count(*)=5–統(tǒng)計(jì)全部的記錄行數(shù),包括為null的行
  • count(id)=5–按照主鍵統(tǒng)計(jì)所以行數(shù),掃描全表統(tǒng)計(jì)
  • count(1)=5–統(tǒng)計(jì)全部的記錄行數(shù),包括為bull的行
  • count(name)=5–按照name列統(tǒng)計(jì)name不為null的記錄行數(shù)
  • count(age)=3–按照age列統(tǒng)計(jì)age值不為null的記錄行數(shù)
  • count(address)=3–按照address統(tǒng)計(jì)address不為null的記錄行數(shù)

總結(jié)

執(zhí)行速度上:針對(duì)一般情況(SQL語句中沒有where條件)執(zhí)行速度上count(*)=count(1)>count(主鍵)>count(其他列),在沒有其他特殊要求的情況下推薦大家使用count(*)來代替其他的count。

執(zhí)行結(jié)果上,count(*)與count(1)以及count(主鍵)的結(jié)果完全相同,即返回表中的所有行數(shù),包含null 值;count(其他列)會(huì)排除掉該列值為null的記錄,返回的值小于或者等于總行數(shù)。

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

相關(guān)文章

  • mysql下普通索引和唯一索引的效率對(duì)比

    mysql下普通索引和唯一索引的效率對(duì)比

    昨天有位同事說,他的網(wǎng)頁查詢過程中發(fā)現(xiàn)普通索引和唯一索引的效率是有差別的,普通索引比唯一索引快
    2010-12-12
  • MySQL日志文件詳解

    MySQL日志文件詳解

    這篇文章主要介紹了MySQL日志文件詳解,本文分別講解了錯(cuò)誤日志、二進(jìn)制日志、通用查詢?nèi)罩?、慢查詢?nèi)罩尽nnodb的在線redo日志、更新日志等日志類型和作用介紹,需要的朋友可以參考下
    2015-07-07
  • mysql 列轉(zhuǎn)行,合并字段的方法(必看)

    mysql 列轉(zhuǎn)行,合并字段的方法(必看)

    下面小編就為大家?guī)硪黄猰ysql 列轉(zhuǎn)行,合并字段的方法(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-03-03
  • Mysql索引性能優(yōu)化問題解決方案

    Mysql索引性能優(yōu)化問題解決方案

    這篇文章主要介紹了Mysql索引性能優(yōu)化問題解決方案,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-09-09
  • mysql調(diào)優(yōu)的幾種方式小結(jié)

    mysql調(diào)優(yōu)的幾種方式小結(jié)

    本文主要介紹了mysql調(diào)優(yōu)的幾種方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • mysql數(shù)據(jù)庫表增添字段,刪除字段,修改字段的排列等操作

    mysql數(shù)據(jù)庫表增添字段,刪除字段,修改字段的排列等操作

    這篇文章主要介紹了mysql數(shù)據(jù)庫表增添字段,刪除字段,修改字段的排列等操作,修改表指的是修改數(shù)據(jù)庫之后中已經(jīng)存在的數(shù)據(jù)表的結(jié)構(gòu)
    2022-07-07
  • MAC下Mysql5.7+ MySQL Workbench安裝配置方法圖文教程

    MAC下Mysql5.7+ MySQL Workbench安裝配置方法圖文教程

    這篇文章主要為大家詳細(xì)介紹了MAC下Mysql5.7+ MySQL Workbench安裝配置方法圖文教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • MySql忘記密碼修改方式適應(yīng)5.7以上版本

    MySql忘記密碼修改方式適應(yīng)5.7以上版本

    這篇文章主要介紹了MySql忘記密碼修改方式適應(yīng)5.7以上版本,需要的朋友可以參考下
    2017-06-06
  • 基于MySql驗(yàn)證的vsftpd虛擬用戶

    基于MySql驗(yàn)證的vsftpd虛擬用戶

    這篇文章主要介紹了基于MySql驗(yàn)證的vsftpd虛擬用戶,文章包括mysql安裝及ftp服務(wù)器安裝過程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-11-11
  • Mysql中聚簇索引和非聚簇索引的區(qū)別詳解

    Mysql中聚簇索引和非聚簇索引的區(qū)別詳解

    這篇文章主要介紹了Mysql中聚簇索引和非聚簇索引的區(qū)別詳解,聚簇索引就是按照每張表的主鍵構(gòu)造一顆B+樹,同時(shí)葉子節(jié)點(diǎn)中存放的就是整張表的行記錄數(shù)據(jù),也將聚集索引的葉子節(jié)點(diǎn)稱為數(shù)據(jù)頁,需要的朋友可以參考下
    2023-07-07

最新評(píng)論