MYSQL 從項目經理的一次查詢,到MYSQL 查詢語句優化方法多

2021-12-09 AustinDatabases

收錄於話題 #mysql 53個內容

事情的起因是,我們的一個項目經理需要對一個資料庫的信息進行查詢,SQL 人家都會寫的。(語句已經經過處理欄位名,和原有的語句不同)語句並不複雜, mysql 5.7.23

select c.APP,c.CON,c.ACT,c.term, 

(select sum(AMORTIZEAMT) 

from tb_amortize t1 

where t1.CAM= c.CON and t1.SAP_PO_IND='F') 待攤銷, 

(select sum(AMORTIZEAMT) 

from tb_amortize t2 

where t2.CA= c.CONTRACTNO and t2.SAP_PO_IND='T') 已攤銷 

from tb_sync_contract c 

where 1=1 and c.ACT>='2020-06-01' and  c.ACT<='2020-06-30'  ;

查詢計劃在下面,基本上半小時是沒法給出數據,主要的原因是一張表的數據量有點大;

我們對於這樣的表進行了SQL 查詢的改寫,但結果一般

1  方法,驅動表的位置的變換

我們將小的表放到了驅動表的位置,大表放到了下面

結果並沒有好轉

2  方法,嘗試通過再次減小驅動表的方式來加速查詢

select a.AP,a.CONTR,a.ACTIVEDATE,a.term,sum(b.AMORTIZEAMT) as 『以』

  from (select APPL,CONTR,ACTI,term from tb_sync_ct foe index (idx_activedate) where ACTI>='2020-06-01' and ACTI<='2020-06-05') as a 

  inner join tb_am as b on a.CONTRA = b.CAMA and b.SAP_PO='T';

3  方法,將合同表的數據直接導入到新的表中,基本是不到4萬條數據,但和2000萬的表進行查詢,速度還是很慢

select a.APP,a.CONT,a.ACTIE,sum(b.AMOT) as 『以』

from tb_sync_con_s as a 

inner join tb_amo as b on a.CONTRA = b.CAM 

where b.SP_P='T';

常用的方法都不奏效的情況下,我們問了顧問邏輯,主要的邏輯其實就是將每個月的一堆的記錄(幾萬條),和另一個表的2000多萬的記錄進行一個計算,其中關係是 一對多的關係。

所以即使在有索引的情況下,將常用的方式方法都使用的情況下,對這樣的OLAP的操作 MYSQL 還是「肌無力」。

後面我們轉換了思路,MYSQL 本身在 JOIN 方面的性能差,但對於單條記錄的計算還是很快的,我們不行就通過中間表的方式,將合併的計算變為單條記錄,加 中間表 + 在次計算的方式來進行。

解決的方案也很簡單, 其實就是通過解耦和單獨輪休的方式,將問題解決,

主要是通過兩個中間表的方式,實際上也可以用一個中間表的方式來計算.

通過這個事情,其實可以很明顯的看出一個問題,為什麼MYSQL在網際網路企業用的風生水起,一到傳統企業,業務邏輯計算複雜的企業就玩不轉了.

1  MYSQL 本身的機理使然,這點就不重複的,業內都知道是怎麼回事

2  業務邏輯的問題

3  傳統企業缺乏 IT 方面的整合型的人才

大多數成熟的網際網路企業都有DEVOPS 這個工作的職位,DEVOPS 可不光是解決系統層級的問題, 業務方面的問題,如上數據方面的操作也是需要DEVOPS來完成的.  傳統型的企業原先基本上使用的是商業性的資料庫,所以這方面本來是沒有需求的, 但隨著MYSQL的大量使用, 分庫分表後的數據融合, 數據的聚合計算,等等也都充滿了需求, 所以傳統型企業如果想用好MYSQL DEVOPS的介入那是不可缺的存在.

如上的需求,可以做一個界面,將這些操作自動化化,需要的人員僅僅輸入相關的變量參數,就可以直接將結果獲得,可惜大多數傳統企業,在最初並不知道這些問題,可能會導致對MYSQL的誤解.  

不過話說回來,DBA 不會PYTHON 估計在這年月也快說不過去了

相關焦點

  • MySQL如何完成一次查詢?
    那麼從發出一條sql指令到返回結果mysql都做了什麼事情呢?mysql完成一次查詢過程是比較複雜的,在說明查詢過程前先介紹一下它的基礎概念和結構原理來幫助理解。下面從四個方面介紹,分別是mysql語句,mysql結構原理,mysql查詢過程,最後設置幾個有趣問題。
  • mysql查詢優化explain命令詳解
    mysql查詢優化的方法有很多種,explain是工作當中用的比較多的一種檢查方式。
  • MySQL優化:定位慢查詢的兩種方法以及使用explain分析SQL
    一條SQL查詢語句在經過MySQL查詢優化器處理後會生成一個所謂的執行計劃,這個執行計劃展示了具體執行查詢的方式,比如多表連接的順序是什麼,對於每個表採用什麼訪問方法來具體執行查詢等等。本章的內容就是為了幫助大家看懂EXPLAIN語句的各個輸出項都是幹嘛使的,從而可以有針對性的提升我們查詢語句的性能。
  • mysql 慢查詢命令
    如何查找MySQL中查詢慢的SQL語句更多如何在mysql查找效率慢的SQL語句呢?4,log_queries_not_using_indexes這個參數設置為ON,可以捕獲到所有未使用索引的SQL語句,儘管這個SQL語句有可能執行得挺快。
  • MySQL 語句大全:創建、授權、查詢、修改等
    就可以連接到本地的MySql資料庫了。不帶where參數的delete語句可以刪除mysql表中所有內容,使用truncate table也可以清空mysql表中所有內容。效率上truncate比delete快,但truncate刪除後不記錄mysql日誌,不可以恢復數據。delete的效果有點像將mysql表中所有記錄一條一條刪除到刪完,而truncate相當於保留mysql表的結構,重新創建了這個表,所有的狀態都相當於新表。
  • 面對MySQL 查詢索引失效,程式設計師的六大優化技巧!
    但是,你寫SQL語句的時候,並沒有主動指定使用哪個索引。不知道你有沒有碰到過這種情況,一條創建了索引的SQL語句在查詢過程中卻沒有使用索引,或是一條本來可以執行的很快的語句,卻由於MySQL選錯了索引,而導致查詢速度變得很慢?充分優化和利用索引能夠大大提高數據的查詢效率,但是在實際的應用中MySQL可能並不總會選擇合適且效率高的索引。
  • MySQL優化:學會使用show profile和trace分析慢查詢
    MySQL優化:定位慢查詢的兩種方法以及使用explain分析SQL在上一節我們學習了定位慢 SQL 及使用 explain 分析慢 SQL,我們也提到了分析慢 SQL 還有 show profile 和 trace 等方法,本節就重點補充學習這兩種方法。
  • MySQL的limit用法和分頁查詢的性能分析及優化
    mysql> SELECT * FROM table LIMIT 5,10; // 檢索記錄行 6-15 //為了檢索從某一個偏移量到記錄集的結束所有的記錄行,可以指定第二個參數為 -1:mysql> SELECT * FROM table LIMIT 95,-1; // 檢索記錄行 96-last.
  • Mysql中一條SQL查詢語句是如何執行的?
    2.查詢流程解析select * from table1 where ID=10;這條語句相信大家再熟悉不過了,下面我們就看看這一條語句在mysql中是怎麼執行的。第一步:一條sql語句要經過連接器,客戶端要和mysql建立連接。
  • mysql查詢——mysql中數據累加的方法
    下圖是一張3月份的銷售數據表(sales),其中包含欄位序號Id、日期Date、銷量Sales,現在需要編寫一個查詢語句,統計3月1日到每日的累計銷量。方法一:通過自定義變量實現select date,sales,@cum_sales:=@cum_sales+sales as cum_salesfrom sales,(select @cum_sales:=0)corder by date asc;方法二:通過將聚合函數sum作為窗口函數實現(mysql8.0及以上版本可用
  • mysql資料庫select查詢語句
    select的相關語句在mysql中用的非常多,介紹一下。select語句的介紹1 select * from 表名;*(代表表中的所有欄位)2 select distinct 欄位名 from表名 ; distinct 去掉重複欄位3 select * from 表名 where 條件 ;where 添加查詢的限制條件比較運算符 >、<、>=、<=、!
  • 入門MySQL——查詢語法練習
    前言:前面幾篇文章為大家介紹了DML以及DDL語句的使用方法,本篇文章將主要講述常用的查詢語法。
  • MySQL 百萬級數據,怎麼做分頁查詢?
    對limit分頁問題的性能優化方法利用表的覆蓋索引來加速分頁查詢我們都知道,利用了索引查詢的語句中如果只包含了那個索引列(覆蓋索引),那麼這種情況會查詢很快。複合索引優化方法MySql 性能到底能有多高?MySql 這個資料庫絕對是適合dba級的高手去玩的,一般做一點1萬篇新聞的小型系統怎麼寫都可以,用xx框架可以實現快速開發。可是數據量到了10萬,百萬至千萬,他的性能還能那麼高嗎?一點小小的失誤,可能造成整個系統的改寫,甚至更本系統無法正常運行!好了,不那麼多廢話了。
  • MySQL如何查詢當前正在運行的SQL語句
    通過status命令,查看Slow queries這一項,如果值長時間>0,說明有查詢執行時間過長 > 以下為引用的內容: mysql> status; -------------- mysql Ver 11.18 Distrib 3.23.58, for redhat-linux-gnu (i386) Connection id: 53
  • 從Web查詢資料庫之PHP與MySQL篇
    ');返回一個資源,這個資源表示資料庫的連接,而且 如果使用過程方法,必須將這個資源傳遞到mysqli的所有其它函數。查詢資料庫 要執行資料庫查詢,首先應構造查詢語句:$query = select * from user;然後運行 $result = $db->query($query);或者$result = mysqli_query($db,$query); 面向對象版本將返回一個結果對象;過程版本將返回一個結果資源。無論何種方法都將結果保存在$result變量中工以後使用。
  • MySQL 事務預編譯查詢和Perl DBI簡化
    文章討論了支持MySQL事務和預編譯查詢的Perl DBI函數,並對其工作原理和應用方法進行說明。預編譯查詢在資料庫中執行批量上傳時,我們經常見到這樣的SQL查詢,這些查詢僅在提交給INSERT命令的參數上有所不同。在這些情況下,應用所謂的預編譯查詢是一種常用的優化方法,它為查詢建立一個模板,然後再向模板中導入不同的必要值,從而減少了資料庫消耗。
  • 06-mysql基礎-mysql中的DQL-子查詢
    在上一期05-mysql基礎-mysql中的DQL-連接查詢的推文中我們學習了mysql的連接查詢知識,本期我們將繼續學習DQL中的子查詢。子查詢介紹含義:出現在其他語句中的select語句,成為子查詢或內查詢外部的查詢語句,成為主查詢或外查詢分類:按子查詢出現的位置: select後面 僅支持標量子查詢 from後面 支持表子查詢 where或having後面 支持標量子查詢(*) 列子查詢(*) 行子查詢
  • MySQL查詢語句中的IN 和Exists 對比分析
    背景介紹最近在寫SQL語句時,對選擇IN 還是Exists 猶豫不決,於是把兩種方法的SQL都寫出來對比一下執行效率
  • MySQL全面瓦解—子查詢和組合查詢
    SQL支持創建子查詢( subquery) ,就是嵌套在其他查詢中的查詢 ,也就是說在select語句中會出現其他的select語句,我們稱為子查詢或內查詢。而外部的select語句,稱主查詢或外查詢。
  • MySQL 這該死的 「IN (子查詢)」
    一、什麼是子查詢簡而言之,子查詢就是嵌套在主查詢裡的查詢,如:SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);SELECT * FROM t1 JOIN (SELECT * FROM t2 WHERE id%2 = 0) tmp ON t1.id = tmp.ref_id