leftjoin多个on条件_MYSQL|为什么LEFT JOIN会这么慢?
? ? ? ? 之前談了怎樣后臺(tái)導(dǎo)出SAP序時(shí)賬,因?yàn)閷?dǎo)出的序時(shí)賬數(shù)據(jù)量較大(3家主體公司,2017-2020年的數(shù)據(jù)),用了數(shù)據(jù)庫MYSQL中的LEFT JOIN 來處理連接多表匯總數(shù)據(jù),查詢太慢啦,后來淪落到用手工分年來匯總數(shù)據(jù),然后再導(dǎo)到MYSQL進(jìn)行數(shù)據(jù)查詢分析,慘兮兮,寶寶真的很生氣,今天我就在項(xiàng)目結(jié)束后來搞一搞原因,為什么會(huì)這么慢?
01
背景
? ? ? ? 首先說下項(xiàng)目背景,從SAP后臺(tái)導(dǎo)出了與會(huì)計(jì)憑證相關(guān)的兩張表,兩張表分別是BSEG(分字段導(dǎo)了兩次)和BKPF,明細(xì)字段結(jié)構(gòu)如下所示:
? ? ? ? 我現(xiàn)在的目標(biāo)是把三張表數(shù)據(jù)拼成一張表數(shù)據(jù),即一條完整的憑證,最終應(yīng)當(dāng)實(shí)現(xiàn)的結(jié)果為:
02
解決思路
我理了下處理這三張表數(shù)據(jù)的思路:
1、將BSEG1和BSEG2這兩張表數(shù)據(jù)以公司、年度、憑證編號(hào)、項(xiàng)這4個(gè)字段為索引連接起來,得到一個(gè)完整的BSEG表;
2、將BSEG表和BKPF表這兩張表數(shù)據(jù)以公司、年度、憑證編號(hào)這3個(gè)字段為索引連接起來,得到一個(gè)完整的憑證表。
步驟1:下面我來進(jìn)行上述問題解決思路的第一個(gè)步驟,用到了以下語句,我用10條以內(nèi)的數(shù)據(jù)試了一下,花了0.003秒,這個(gè)語句完美的實(shí)現(xiàn)了我的需求,而且在ON后面對(duì)4個(gè)條件加上括號(hào)實(shí)現(xiàn)的結(jié)果也完全一樣,如下所示:
SELECT * FROM bseg2 t ?LEFT JOIN ?bseg1 s
ON (s.公司=t.公司1
and s.憑證號(hào)碼=t.憑證號(hào)碼1
and s.年度=t.年度1
and s.項(xiàng)=t.項(xiàng)1)
? ? ? ? ?可是我的BSEG表1和BSEG表2 分別包含了104,2033條和104,4095條數(shù)據(jù),百萬行數(shù)據(jù)4個(gè)條件同時(shí)LEFT JOIN,項(xiàng)目進(jìn)行的時(shí)候我試過了,一下午沒跑出來,要是我去客戶公司對(duì)面的那座山去溜幾圈,可能都已經(jīng)回來了……
? ? ? ? ?好了,我改變方法了,把4個(gè)條件字段連接起來單獨(dú)插入一列,分別構(gòu)成兩張表的主鍵(意思是該列元素均為唯一且不為空),用到了CONCAT語句,可以把多個(gè)字段的信息連接起來。例如:SELECT CONCAT('M','y','S','Q','L')——該語句的執(zhí)行結(jié)果為MYSQL ;那么現(xiàn)在我的問題就轉(zhuǎn)化成了,以O(shè)RDER_NO字段連接BSEG1和BSEG2數(shù)據(jù),由原來的4個(gè)連接條件變成了1個(gè)連接條件。
? ? ? ? 好的,在連接兩表數(shù)據(jù)前還有關(guān)鍵的一步,添加索引,添加索引的效果是可以加快查詢速度,添加主鍵索引我用到了以下語句,意思是為表BSEG1的ORDER_NO 字段添加索引,添加索引真的得用語句來加索引,數(shù)據(jù)量大千萬不能用設(shè)計(jì)表的那個(gè)傻瓜式圖形界面來添加,我試過,設(shè)計(jì)表圖形界面添加索引,會(huì)讓你的MYSQL停留在那個(gè)界面,完全卡死。語句添加索引我忘了截圖完成時(shí)間,幾十秒。
ALTER TABLE? bseg1 PRIMARY KEY (order_no)
? ? ? 見證奇跡的時(shí)刻到了,把LEFT JOIN寫上去,以O(shè)RDER_NO連接兩表數(shù)據(jù)。26.541s,哼,亮瞎了我的眼,又高興又生氣。
步驟2:我沒有在MYSQL中操作把步驟一中得到的BSEG表和BKPF連接了,大致思路就是現(xiàn)在BKPF和BSEG連接有三個(gè)條件字段(公司、憑證編號(hào)、年度),解決方法參見步驟1.
03
寫在最后
? ? ? ? 現(xiàn)在我開始吐槽了,我真的高興,又有點(diǎn)生氣,甚至說是不甘心。我手工匯了老半天,MYSQL你26s就給我跑出來了,想想就不甘心。然后我又試著說服自己,以后遇到這種問題,應(yīng)該心里就有底了,唉,還是不甘心吶
去抖音看我跳舞喔!
公眾號(hào) : MOMO的筆記
抖音號(hào):348785339
總結(jié)
以上是生活随笔為你收集整理的leftjoin多个on条件_MYSQL|为什么LEFT JOIN会这么慢?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql 中文字段名_MySQL全文索
- 下一篇: 华为 Mate X 等机型获推鸿蒙 Ha