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

MySQL巧用sum、case和when優(yōu)化統(tǒng)計(jì)查詢

 更新時(shí)間:2021年03月17日 16:59:16   作者:飛鍋鍋  
這篇文章主要給大家介紹了關(guān)于MySQL巧用sum、case和when優(yōu)化統(tǒng)計(jì)查詢的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

最近在公司做項(xiàng)目,涉及到開(kāi)發(fā)統(tǒng)計(jì)報(bào)表相關(guān)的任務(wù),由于數(shù)據(jù)量相對(duì)較多,之前寫的查詢語(yǔ)句查詢五十萬(wàn)條數(shù)據(jù)大概需要十秒左右的樣子,后來(lái)經(jīng)過(guò)老大的指點(diǎn)利用sum,case...when...重寫SQL性能一下子提高到一秒鐘就解決了。這里為了簡(jiǎn)潔明了的闡述問(wèn)題和解決的方法,我簡(jiǎn)化一下需求模型。

現(xiàn)在數(shù)據(jù)庫(kù)有一張訂單表(經(jīng)過(guò)簡(jiǎn)化的中間表),表結(jié)構(gòu)如下:

CREATE TABLE `statistic_order` (
 `oid` bigint(20) NOT NULL,
 `o_source` varchar(25) DEFAULT NULL COMMENT '來(lái)源編號(hào)',
 `o_actno` varchar(30) DEFAULT NULL COMMENT '活動(dòng)編號(hào)',
 `o_actname` varchar(100) DEFAULT NULL COMMENT '參與活動(dòng)名稱',
 `o_n_channel` int(2) DEFAULT NULL COMMENT '商城平臺(tái)',
 `o_clue` varchar(25) DEFAULT NULL COMMENT '線索分類',
 `o_star_level` varchar(25) DEFAULT NULL COMMENT '訂單星級(jí)',
 `o_saledep` varchar(30) DEFAULT NULL COMMENT '營(yíng)銷部',
 `o_style` varchar(30) DEFAULT NULL COMMENT '車型',
 `o_status` int(2) DEFAULT NULL COMMENT '訂單狀態(tài)',
 `syctime_day` varchar(15) DEFAULT NULL COMMENT '按天格式化日期',
 PRIMARY KEY (`oid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

項(xiàng)目需求是這樣的:

統(tǒng)計(jì)某段時(shí)間范圍內(nèi)每天的來(lái)源編號(hào)數(shù)量,其中來(lái)源編號(hào)對(duì)應(yīng)數(shù)據(jù)表中的o_source字段,字段值可能為CDE,SDE,PDE,CSE,SSE。

來(lái)源分類隨時(shí)間流動(dòng)

一開(kāi)始寫了這樣一段SQL:

select S.syctime_day,
 (select count(*) from statistic_order SS where SS.syctime_day = S.syctime_day and SS.o_source = 'CDE') as 'CDE',
 (select count(*) from statistic_order SS where SS.syctime_day = S.syctime_day and SS.o_source = 'CDE') as 'SDE',
 (select count(*) from statistic_order SS where SS.syctime_day = S.syctime_day and SS.o_source = 'CDE') as 'PDE',
 (select count(*) from statistic_order SS where SS.syctime_day = S.syctime_day and SS.o_source = 'CDE') as 'CSE',
 (select count(*) from statistic_order SS where SS.syctime_day = S.syctime_day and SS.o_source = 'CDE') as 'SSE'
 from statistic_order S where S.syctime_day > '2016-05-01' and S.syctime_day < '2016-08-01' 
 GROUP BY S.syctime_day order by S.syctime_day asc;

這種寫法采用了子查詢的方式,在沒(méi)有加索引的情況下,55萬(wàn)條數(shù)據(jù)執(zhí)行這句SQL,在workbench下等待了將近十分鐘,最后報(bào)了一個(gè)連接中斷,通過(guò)explain解釋器可以看到SQL的執(zhí)行計(jì)劃如下:

每一個(gè)查詢都進(jìn)行了全表掃描,五個(gè)子查詢DEPENDENT SUBQUERY說(shuō)明依賴于外部查詢,這種查詢機(jī)制是先進(jìn)行外部查詢,查詢出group by后的日期結(jié)果,然后子查詢分別查詢對(duì)應(yīng)的日期中CDE,SDE等的數(shù)量,其效率可想而知。

在o_source和syctime_day上加上索引之后,效率提高了很多,大概五秒鐘就查詢出了結(jié)果:

查看執(zhí)行計(jì)劃發(fā)現(xiàn)掃描的行數(shù)減少了很多,不再進(jìn)行全表掃描了:

這當(dāng)然還不夠快,如果當(dāng)數(shù)據(jù)量達(dá)到百萬(wàn)級(jí)別的話,查詢速度肯定是不能容忍的。一直在想有沒(méi)有一種辦法,能否直接遍歷一次就查詢出所有的結(jié)果,類似于遍歷java中的list集合,遇到某個(gè)條件就計(jì)數(shù)一次,這樣進(jìn)行一次全表掃描就可以查詢出結(jié)果集,結(jié)果索引,效率應(yīng)該會(huì)很高。在老大的指引下,利用sum聚合函數(shù),加上case...when...then...這種“陌生”的用法,有效的解決了這個(gè)問(wèn)題。
具體SQL如下:

 select S.syctime_day,
 sum(case when S.o_source = 'CDE' then 1 else 0 end) as 'CDE',
 sum(case when S.o_source = 'SDE' then 1 else 0 end) as 'SDE',
 sum(case when S.o_source = 'PDE' then 1 else 0 end) as 'PDE',
 sum(case when S.o_source = 'CSE' then 1 else 0 end) as 'CSE',
 sum(case when S.o_source = 'SSE' then 1 else 0 end) as 'SSE'
 from statistic_order S where S.syctime_day > '2015-05-01' and S.syctime_day < '2016-08-01' 
 GROUP BY S.syctime_day order by S.syctime_day asc;

關(guān)于MySQL中case...when...then的用法就不做過(guò)多的解釋了,這條SQL很容易理解,先對(duì)一條一條記錄進(jìn)行遍歷,group by對(duì)日期進(jìn)行了分類,sum聚合函數(shù)對(duì)某個(gè)日期的值進(jìn)行求和,重點(diǎn)就在于case...when...then對(duì)sum的求和巧妙的加入了條件,當(dāng)o_source = 'CDE'的時(shí)候,計(jì)數(shù)為1,否則為0;當(dāng)o_source='SDE'的時(shí)候......

這條語(yǔ)句的執(zhí)行只花了一秒多,對(duì)于五十多萬(wàn)的數(shù)據(jù)進(jìn)行這樣一個(gè)維度的統(tǒng)計(jì)還是比較理想的。

通過(guò)執(zhí)行計(jì)劃發(fā)現(xiàn),雖然掃描的行數(shù)變多了,但是只進(jìn)行了一次全表掃描,而且是SIMPLE簡(jiǎn)單查詢,所以執(zhí)行效率自然就高了:

針對(duì)這個(gè)問(wèn)題,如果大家有更好的方案或思路,歡迎留言

總結(jié)

到此這篇關(guān)于MySQL巧用sum、case和when優(yōu)化統(tǒng)計(jì)查詢的文章就介紹到這了,更多相關(guān)MySQL優(yōu)化統(tǒng)計(jì)查詢內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MySQL索引優(yōu)化之不適合構(gòu)建索引及索引失效的幾種情況詳解

    MySQL索引優(yōu)化之不適合構(gòu)建索引及索引失效的幾種情況詳解

    索引是有雙面性的,合理的建立索引可以提高數(shù)據(jù)庫(kù)的效率。但是如果沒(méi)有合理的構(gòu)建索引和使用索引,可能會(huì)導(dǎo)致索引失效或者影響數(shù)據(jù)庫(kù)性能,本文主要討論的是索引失效以及不適合建立索引的場(chǎng)景
    2022-07-07
  • MySql創(chuàng)建帶解釋的表及給表和字段加注釋的實(shí)現(xiàn)代碼

    MySql創(chuàng)建帶解釋的表及給表和字段加注釋的實(shí)現(xiàn)代碼

    這篇文章主要介紹了MySql創(chuàng)建帶解釋的表以及給表和字段加注釋的實(shí)現(xiàn)方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2016-12-12
  • 深入sql數(shù)據(jù)連接時(shí)的一些問(wèn)題分析

    深入sql數(shù)據(jù)連接時(shí)的一些問(wèn)題分析

    本篇文章是對(duì)關(guān)于sql數(shù)據(jù)連接時(shí)的一些問(wèn)題進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • mysql閃回工具binlog2sql安裝配置教程詳解

    mysql閃回工具binlog2sql安裝配置教程詳解

    這篇文章主要介紹了mysql閃回工具binlog2sql安裝配置詳解,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • Mysql中find_in_set()函數(shù)用法詳解以及使用場(chǎng)景

    Mysql中find_in_set()函數(shù)用法詳解以及使用場(chǎng)景

    前幾天在sql查詢的時(shí)候,想要判斷數(shù)據(jù)庫(kù)中表的某一列中的值是否在List集合中,接觸到了find_in_set的使用,用起來(lái)方便快捷,下面這篇文章主要給大家介紹了關(guān)于Mysql中find_in_set()函數(shù)用法詳解以及使用場(chǎng)景的相關(guān)資料,需要的朋友可以參考下
    2023-03-03
  • MySQL連接拋出Authentication Failed錯(cuò)誤的分析與解決思路

    MySQL連接拋出Authentication Failed錯(cuò)誤的分析與解決思路

    這篇文章主要給大家介紹了關(guān)于MySQL連接拋出Authentication Failed錯(cuò)誤的分析與解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • MySQL百萬(wàn)數(shù)據(jù)深度分頁(yè)優(yōu)化思路解析

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

    這篇文章主要為大家介紹了MySQL百萬(wàn)數(shù)據(jù)深度分頁(yè)優(yōu)化思路分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • MySQL在不知道列名情況下的注入詳解

    MySQL在不知道列名情況下的注入詳解

    這篇文章主要給大家介紹了關(guān)于MySQL在不知道列名情況下的注入的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 使用mysql查詢顯示行號(hào)的示例代碼

    使用mysql查詢顯示行號(hào)的示例代碼

    MySQL變量是一種用于存儲(chǔ)和操縱數(shù)據(jù)的數(shù)據(jù)類型,通過(guò)在SQL查詢中使用變量,我們可以創(chuàng)建一個(gè)MySQL查詢,用于獲取每行數(shù)據(jù)的行號(hào),本文給大家介紹了使用mysql查詢顯示行號(hào)的示例代碼,需要的朋友可以參考下
    2024-01-01
  • mysql插入重復(fù)數(shù)據(jù)的處理(DUPLICATE、IGNORE、REPLACE)

    mysql插入重復(fù)數(shù)據(jù)的處理(DUPLICATE、IGNORE、REPLACE)

    這篇文章主要介紹了mysql插入重復(fù)數(shù)據(jù)的處理方式(DUPLICATE、IGNORE、REPLACE),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09

最新評(píng)論

蒲城县| 佛坪县| 策勒县| 库尔勒市| 宜川县| 东阿县| 那坡县| 怀来县| 十堰市| 永仁县| 阿拉善左旗| 乌拉特后旗| 松原市| 江川县| 黑水县| 当阳市| 安乡县| 巴林左旗| 诏安县| 贵溪市| 青浦区| 曲麻莱县| 屏东市| 韩城市| 芜湖县| 尚义县| 永平县| 奈曼旗| 温宿县| 靖江市| 莎车县| 准格尔旗| 汶川县| 青海省| 信宜市| 博野县| 平原县| 开江县| 南宫市| 延寿县| 杭州市|