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

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

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

count()是SQL中一個常用的聚合函數(shù),其被用來統(tǒng)計記錄的總數(shù),下面通過幾個示例來說明此類查詢的注意事項及應用技巧。

一、count()的含義

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

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

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

示例: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是一個空值,查詢count(*)和count(name)觀察區(qū)別:

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

在這里插入圖片描述

二、count()的應用技巧

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

2.1 同時統(tǒng)計多列

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

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;

在這里插入圖片描述

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

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

由于這幾個問題的分組條件都不同,無法用1個group by條件概括。按照常規(guī)思路,第1,2個問題應該是count(*)然后group by name,第三個問題應該是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個問題的答案,但對表查詢了3次,假設在生產(chǎn)環(huán)境這個表非常大,那么性能必然低下。稍微優(yōu)化一下,我們可以用一次查詢同時回答上面4個問題:

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

在這里插入圖片描述

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

2.2 利用執(zhí)行計劃

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

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

explain select count(*) from test;

在這里插入圖片描述

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

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

相關文章

  • 同時運行多個MySQL服務器的方法

    同時運行多個MySQL服務器的方法

    在同一臺機器上運行多個有些情況下你可能想要在同一臺機器上運行多個服務器。例如,你可能想要測試一個新的MySQL版本而讓你現(xiàn)有生產(chǎn)系統(tǒng)的設置不受到干擾, 或你可能是想要為不同的客戶提供獨立的MySQL安裝一個因特網(wǎng)服務供應商。
    2008-05-05
  • 詳解Mysql數(shù)據(jù)庫平滑擴容解決高并發(fā)和大數(shù)據(jù)量問題

    詳解Mysql數(shù)據(jù)庫平滑擴容解決高并發(fā)和大數(shù)據(jù)量問題

    本文主要介紹了Mysql數(shù)據(jù)庫平滑擴容解決高并發(fā)和大數(shù)據(jù)量問題,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • MySQL高可用解決方案MMM(mysql多主復制管理器)

    MySQL高可用解決方案MMM(mysql多主復制管理器)

    MySQL本身沒有提供replication failover的解決方案,通過MMM方案能實現(xiàn)服務器的故障轉移,從而實現(xiàn)mysql的高可用。MMM不僅能提供浮動IP的功能,如果當前的主服務器掛掉后,會將你后端的從服務器自動轉向新的主服務器進行同步復制,不用手工更改同步配置
    2017-09-09
  • 如何在mysql進行查詢緩存及失敗的解決方法

    如何在mysql進行查詢緩存及失敗的解決方法

    這篇文章主要介紹了如何在mysql進行查詢緩存及失敗的解決方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-01-01
  • MySQL存儲引擎簡介及MyISAM和InnoDB的區(qū)別

    MySQL存儲引擎簡介及MyISAM和InnoDB的區(qū)別

    這篇文章主要介紹了MySQL存儲引擎簡介及MyISAM和InnoDB的區(qū)別,重點介紹了MyISAM 和 InnoDB的區(qū)別,需要的朋友可以參考下
    2014-05-05
  • mysql對binlog的處理說明

    mysql對binlog的處理說明

    Mysql和其它開源數(shù)據(jù)庫相比,具有更好的擴展性。其主要原因是它提供了存儲引擎的開放接口。喜歡自己折騰數(shù)據(jù)庫的程序員可以從這個接口起步,打造有個性的數(shù)據(jù)庫。
    2011-07-07
  • CentOS下將MySQL 5.1升級到MySQL 5.5的步驟

    CentOS下將MySQL 5.1升級到MySQL 5.5的步驟

    這篇文章主要介紹了CentOS下將MySQL 5.1升級到MySQL 5.5的步驟,需要的朋友可以參考下
    2015-08-08
  • MySQL?時區(qū)與?serverTimezone詳解

    MySQL?時區(qū)與?serverTimezone詳解

    存儲?TIMESTAMP?類型數(shù)據(jù)時,MySQL 會根據(jù)當前會話的時區(qū)將時間轉換為 UTC 時間,MySQL 實際存儲的是 UTC 時間,這篇文章主要介紹了MySQL?時區(qū)與?serverTimezone,需要的朋友可以參考下
    2024-12-12
  • 兩種方法實現(xiàn)mysql分組計數(shù),范圍匯總

    兩種方法實現(xiàn)mysql分組計數(shù),范圍匯總

    這篇文章主要介紹了兩種方法實現(xiàn)mysql分組計數(shù),范圍匯總,文中示例代碼非常詳細,幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-07-07
  • Mysql查詢?nèi)掌趖imestamp格式的數(shù)據(jù)實現(xiàn)

    Mysql查詢?nèi)掌趖imestamp格式的數(shù)據(jù)實現(xiàn)

    本文主要介紹了Mysql查詢?nèi)掌趖imestamp格式的數(shù)據(jù)實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-01-01

最新評論

綦江县| 武平县| 民乐县| 通山县| 云安县| 宾川县| 高雄市| 华阴市| 敦煌市| 商南县| 水城县| 石渠县| 孝昌县| 浙江省| 会昌县| 上蔡县| 新巴尔虎右旗| 秭归县| 六安市| 鸡泽县| 鹤庆县| 监利县| 鄂尔多斯市| 邻水| 峡江县| 新晃| 高唐县| 崇文区| 灌阳县| 沁水县| 庆云县| 琼结县| 西峡县| 阜城县| 林州市| 牟定县| 翼城县| 萍乡市| 东乡族自治县| 庄浪县| 民和|