欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MySQL count(*/column)查詢(xún)優(yōu)化的實(shí)現(xiàn)

 更新時(shí)間:2024年09月03日 09:55:34   作者:V1ncent Chen  
count()是SQL中一個(gè)常用的聚合函數(shù),其被用來(lái)統(tǒng)計(jì)記錄的總數(shù),本文主要介紹了MySQL count(*/column)查詢(xún)優(yōu)化的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下

count()是SQL中一個(gè)常用的聚合函數(shù),其被用來(lái)統(tǒng)計(jì)記錄的總數(shù),下面通過(guò)幾個(gè)示例來(lái)說(shuō)明此類(lèi)查詢(xún)的注意事項(xiàng)及應(yīng)用技巧。

一、count()的含義

count()用于統(tǒng)計(jì)符合條件的記錄總數(shù),但其有2種用法:count(*)和count(column)

  • count(*) 統(tǒng)計(jì)記錄的總數(shù)
  • count(column) 統(tǒng)計(jì)column列不為空的記錄總數(shù)

這里的概念可能和部分人的理解有些偏差,在SQL中“*”通常代表所有列,SQL會(huì)通過(guò)查詢(xún)數(shù)據(jù)字典來(lái)將其解析為所有列名,而count(*)并不會(huì)這樣做,它會(huì)是直接統(tǒng)計(jì)數(shù)量。而count(column)只有在column列不為空的情況下才與count(*)的查詢(xún)結(jié)果相同,因此如果你想統(tǒng)計(jì)總記錄數(shù),那么直接使用count(*),count(column)的結(jié)果可能會(huì)與你想的不同。

示例:count(*)和count(column)的區(qū)別

create table test(
id int primary key auto_increment,
name varchar(32)
);
insert into test values(null, 'Vincent'), (null, null);
select * from test;

在這里插入圖片描述

表中共2條記錄,其中id為2的name是一個(gè)空值,查詢(xún)count(*)和count(name)觀(guān)察區(qū)別:

select count(*), count(name) from test;

在這里插入圖片描述

二、count()的應(yīng)用技巧

由于count()是一個(gè)聚合函數(shù),因此它在統(tǒng)計(jì)時(shí)會(huì)掃描符合條件的所有記錄,如果我們需要統(tǒng)計(jì)多項(xiàng)匯總數(shù)據(jù),常規(guī)的SQL會(huì)一次次的掃描結(jié)果集,每次統(tǒng)計(jì)出一個(gè)結(jié)果,而利用一些技巧,我們可以一次掃描統(tǒng)計(jì)出多個(gè)匯總數(shù)據(jù)。

2.1 同時(shí)統(tǒng)計(jì)多列

首先改造一下測(cè)試數(shù)據(jù),假設(shè)這是一張銷(xiāo)售明細(xì)表,新增產(chǎn)品和價(jià)格列:

alter table test add product varchar(32), add price decimal(10,2);
truncate table test;
insert into test values(null,‘Vincent', ‘Table', 100),(null,‘Vincent', ‘Chair', 50),(null,‘Vincent', ‘Chair', 50),(null,‘Victor', ‘Table', 100),(null,‘Victor', ‘Chair', 50),(null,‘Victor', ‘Chair', 50),(null,‘Victor', ‘Chair', 50);
select * from test;

在這里插入圖片描述

假設(shè)現(xiàn)在我有下列問(wèn)題:

  • Vincent賣(mài)了幾件商品?
  • Victor賣(mài)了幾件商品?
  • 產(chǎn)品椅子總銷(xiāo)量是多少(不分人員)?
  • 所有產(chǎn)品的銷(xiāo)售總金額是多少?

由于這幾個(gè)問(wèn)題的分組條件都不同,無(wú)法用1個(gè)group by條件概括。按照常規(guī)思路,第1,2個(gè)問(wèn)題應(yīng)該是count(*)然后group by name,第三個(gè)問(wèn)題應(yīng)該是count(*) where product=‘Table’,最后在全表掃描一次求出sum(price),即總金額:

select name,count(*) from test group by name;
select count(*) from test where product='Chair';
select sum(price) from test;

在這里插入圖片描述

雖然上面得到了4個(gè)問(wèn)題的答案,但對(duì)表查詢(xún)了3次,假設(shè)在生產(chǎn)環(huán)境這個(gè)表非常大,那么性能必然低下。稍微優(yōu)化一下,我們可以用一次查詢(xún)同時(shí)回答上面4個(gè)問(wèn)題:

select 
count(name='Vincent' or null) Vincent的銷(xiāo)量,
count(name='Victor' or null) Victor的銷(xiāo)量,
count(product='Chair' or null) 椅子的總銷(xiāo)量,
sum(price) 總銷(xiāo)售金額
from test;

在這里插入圖片描述

這里利用了count(column)不會(huì)統(tǒng)計(jì)null的特性,將條件轉(zhuǎn)移到count()函數(shù)的內(nèi)部,實(shí)現(xiàn)了一次掃描,多個(gè)維度統(tǒng)計(jì)。

2.2 利用執(zhí)行計(jì)劃

當(dāng)表中的數(shù)據(jù)特別大,統(tǒng)計(jì)時(shí)間特別長(zhǎng),而我們需要的結(jié)果又不需要很精確時(shí)??梢酝ㄟ^(guò)執(zhí)行計(jì)劃來(lái)查看預(yù)估的數(shù)量,利用這種方式可以在不實(shí)際執(zhí)行查詢(xún)的結(jié)果下快速得到結(jié)果:

示例:統(tǒng)計(jì)表中某類(lèi)數(shù)據(jù)的數(shù)量,直接通過(guò)執(zhí)行計(jì)劃查看,而不實(shí)際執(zhí)行SQL:

explain select count(*) from test;

在這里插入圖片描述

注意這種方法之適合不需要精確數(shù)字的場(chǎng)景,執(zhí)行計(jì)劃中的rows是根據(jù)統(tǒng)計(jì)信息估計(jì)出來(lái)的,而統(tǒng)計(jì)信息本來(lái)就是個(gè)采樣值而且可能已經(jīng)比較過(guò)時(shí)了,使用這個(gè)方法前可以先執(zhí)行 analyze table tab_name; 更新一下統(tǒng)計(jì)信息。

到此這篇關(guān)于MySQL count(*/column)查詢(xún)優(yōu)化的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)MySQL count(*/column)查詢(xún)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • mysql中邏輯函數(shù)的具體使用

    mysql中邏輯函數(shù)的具體使用

    MySQL中邏輯函數(shù)包括IF、CASE、COALESCE、NULLIF和IFNULL,用于根據(jù)條件對(duì)數(shù)據(jù)進(jìn)行判斷和選擇,適用于復(fù)雜的數(shù)據(jù)處理需求,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-11-11
  • mysql 忘記密碼的解決方法(linux和windows小結(jié))

    mysql 忘記密碼的解決方法(linux和windows小結(jié))

    下面是linux和windows下mysql丟失密碼的解決辦法
    2008-12-12
  • MySQL時(shí)間戳與日期格式的相互轉(zhuǎn)換

    MySQL時(shí)間戳與日期格式的相互轉(zhuǎn)換

    在MySQL數(shù)據(jù)庫(kù)中,時(shí)間戳和日期格式是常用的數(shù)據(jù)類(lèi)型,在MySQL中,我們可以使用函數(shù)還相互轉(zhuǎn)換時(shí)間戳和日期格式,下面我將詳細(xì)的給大家介紹如何進(jìn)行轉(zhuǎn)換,并提供相應(yīng)的代碼示例,感興趣的小伙伴跟著小編一起來(lái)看看吧
    2024-01-01
  • MySQL之information_schema數(shù)據(jù)庫(kù)詳細(xì)講解

    MySQL之information_schema數(shù)據(jù)庫(kù)詳細(xì)講解

    這篇文章主要介紹了MySQL之information_schema數(shù)據(jù)庫(kù)詳細(xì)講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • MySQL命令行導(dǎo)出與導(dǎo)入數(shù)據(jù)庫(kù)

    MySQL命令行導(dǎo)出與導(dǎo)入數(shù)據(jù)庫(kù)

    這篇文章主要為大家詳細(xì)介紹了利用命令行MySQL導(dǎo)出數(shù)據(jù)庫(kù)與導(dǎo)入數(shù)據(jù)庫(kù)的例子,感興趣的小伙伴們可以參考一下
    2016-06-06
  • MySQL入門(mén)教程(五)之表的創(chuàng)建、修改和刪除

    MySQL入門(mén)教程(五)之表的創(chuàng)建、修改和刪除

    MySQL 為關(guān)系型數(shù)據(jù)庫(kù)(Relational Database Management System), 本文給大家介紹MySQL入門(mén)教程(五)之表的創(chuàng)建、修改和刪除,需要的朋友一起學(xué)習(xí)吧
    2016-04-04
  • MySQL七大JOIN的具體使用

    MySQL七大JOIN的具體使用

    本文主要介紹了MySQL七大JOIN的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • mysql索引失效的常見(jiàn)九種原因圖文詳解

    mysql索引失效的常見(jiàn)九種原因圖文詳解

    索引失效這個(gè)問(wèn)題的前提應(yīng)該是建立了索引,卻沒(méi)有使用到,或者沒(méi)有完全使用到,下面這篇文章主要給大家介紹了關(guān)于mysql索引失效的常見(jiàn)九種原因的相關(guān)資料,需要的朋友可以參考下
    2022-06-06
  • MySQL數(shù)據(jù)表字段內(nèi)容的批量修改、清空、復(fù)制等更新命令

    MySQL數(shù)據(jù)表字段內(nèi)容的批量修改、清空、復(fù)制等更新命令

    MySQL數(shù)據(jù)表字段內(nèi)容的批量修改、清空、復(fù)制等更新命令,需要的朋友可以參考下。
    2011-08-08
  • MySQL之索引結(jié)構(gòu)解讀

    MySQL之索引結(jié)構(gòu)解讀

    這篇文章主要介紹了MySQL之索引結(jié)構(gòu)解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04

最新評(píng)論