日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

leftjoin多个on条件_MYSQL|为什么LEFT JOIN会这么慢?

發(fā)布時(shí)間:2023/12/15 数据库 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 leftjoin多个on条件_MYSQL|为什么LEFT JOIN会这么慢? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

? ? ? ? 之前談了怎樣后臺(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会这么慢?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。