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

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

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

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

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

CREATE TABLE `statistic_order` (
 `oid` bigint(20) NOT NULL,
 `o_source` varchar(25) DEFAULT NULL COMMENT '來源編號',
 `o_actno` varchar(30) DEFAULT NULL COMMENT '活動編號',
 `o_actname` varchar(100) DEFAULT NULL COMMENT '參與活動名稱',
 `o_n_channel` int(2) DEFAULT NULL COMMENT '商城平臺',
 `o_clue` varchar(25) DEFAULT NULL COMMENT '線索分類',
 `o_star_level` varchar(25) DEFAULT NULL COMMENT '訂單星級',
 `o_saledep` varchar(30) DEFAULT NULL COMMENT '營銷部',
 `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

項目需求是這樣的:

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

來源分類隨時間流動

一開始寫了這樣一段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;

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

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

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

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

這當然還不夠快,如果當數(shù)據(jù)量達到百萬級別的話,查詢速度肯定是不能容忍的。一直在想有沒有一種辦法,能否直接遍歷一次就查詢出所有的結果,類似于遍歷java中的list集合,遇到某個條件就計數(shù)一次,這樣進行一次全表掃描就可以查詢出結果集,結果索引,效率應該會很高。在老大的指引下,利用sum聚合函數(shù),加上case...when...then...這種“陌生”的用法,有效的解決了這個問題。
具體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;

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

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

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

針對這個問題,如果大家有更好的方案或思路,歡迎留言

總結

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

相關文章

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    這篇文章主要給大家介紹了關于MySQL在不知道列名情況下的注入的相關資料,文中通過示例代碼介紹的非常詳細,對大家學習或者使用mysql具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-03-03
  • 使用mysql查詢顯示行號的示例代碼

    使用mysql查詢顯示行號的示例代碼

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

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

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

最新評論

桂东县| 重庆市| 苏尼特左旗| 清原| 安化县| 保康县| 从化市| 和龙市| 原平市| 红河县| 吐鲁番市| 盐城市| 通辽市| 达拉特旗| 安岳县| 句容市| 美姑县| 嘉荫县| 邵东县| 玉门市| 聂荣县| 漾濞| 紫金县| 克拉玛依市| 潮安县| 彭泽县| 石城县| 南涧| 湟源县| 滦平县| 松江区| 乌海市| 武城县| 于都县| 徐汇区| 闻喜县| 梁山县| 灵寿县| 宜都市| 宜都市| 北辰区|