欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

MySQL中Join的執(zhí)行過程有哪些

今天就跟大家聊聊有關(guān)MySQL中Join的執(zhí)行過程有哪些,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。

成都創(chuàng)新互聯(lián)公司專注于正鑲白企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,商城網(wǎng)站定制開發(fā)。正鑲白網(wǎng)站建設(shè)公司,為正鑲白等地區(qū)提供建站服務(wù)。全流程定制網(wǎng)站制作,專業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)

MySQL的Join是如何執(zhí)行的

join可以說一種集合的運(yùn)算,比如left join,right join,inner join,full join,outer join,cross join等,這些集合間的計(jì)算關(guān)系對應(yīng)在高中數(shù)學(xué)集合里面的交集,并集,補(bǔ)集,全集等。但在實(shí)際的代碼中,join運(yùn)算基本上是通過多層循環(huán)來實(shí)現(xiàn)的。

舉一個(gè)例子,假設(shè)有t1,t2兩張表,表結(jié)構(gòu)分別如下:

createtablet1(

idintnotnullAUTO_INCREMENT,

usernamevarchar(20)notnulldefault'',

ageintnotnulldefault0,

PRIMARYkey(`id`)

)ENGINE=INNODBDEFAULTCHARSET=UTF8MB4;

createtablet2(

idintnotnullauto_increment,

usernamevarchar(20)notnulldefault'',

scoreintnotnulldefalut0,

primarykey(`id`)

))ENGINE=INNODBDEFAULTCHARSET=UTF8MB4;

假設(shè)t1有100條數(shù)據(jù),t2表有200條數(shù)

查詢sql為:

selectt1.*,t2.*fromt1leftjoint2on(t1.username=t2.username)

那么這條SQL的執(zhí)行步驟如下:

從表t1中取一行數(shù)據(jù)r1

從r1中,取出字段username到表t2中查詢

取出表t2中滿足條件的行,跟r1組成一行,作為結(jié)果集的一部份

重復(fù)執(zhí)行步驟1,2,3,直到表t1的所以數(shù)據(jù)循環(huán)完畢

基本上先遍歷t,1,然后根據(jù)t1中的每行數(shù)據(jù)中的username,去表t2中查找滿足條件的記錄?;揪褪?層循環(huán)。

如何優(yōu)化join查詢

從上面可以看出,join本質(zhì)是循環(huán),這里的開銷如下:

遍歷t1數(shù)據(jù),讀取數(shù)據(jù)為t1表的行數(shù),假設(shè)行數(shù)為n,則復(fù)雜度也為n

根據(jù)t1的匹配字段username去t2中一行一行的查詢數(shù)據(jù)

這個(gè)過程,因?yàn)镸ySQL的數(shù)據(jù)存儲結(jié)構(gòu)為二叉樹,時(shí)間復(fù)雜度為log2(m) m為t2表的總行數(shù)

那么總復(fù)雜度近似為 n+n(2log2(m))

從上面的步驟可以看出,優(yōu)化方向:

降低t1查詢時(shí)的開銷,主要是磁盤io開銷,避免全表掃描,用索引

降低t2查詢時(shí)的開銷,也用索引

將數(shù)據(jù)量多的表做被驅(qū)動表,小表作驅(qū)動表,m取了對數(shù),大表數(shù)據(jù)量大對復(fù)雜度的影響沒有線性增長

緩存t1表,不用每次去磁盤load,比如一次緩存100條,那么能顯著降低磁盤讀數(shù)據(jù)次數(shù),t2每次與緩存中的t1數(shù)據(jù)進(jìn)行比較

隨機(jī)磁盤讀比較耗費(fèi)磁盤性能,轉(zhuǎn)為順序讀,因?yàn)槎鏄涞拇鎯Y(jié)構(gòu),每次非主鍵查找,有一個(gè)回表的動作,即根據(jù)主鍵再次查詢需要的數(shù)據(jù)

優(yōu)化的基本方法:

減少循環(huán)次數(shù),減少磁盤IO次數(shù),變隨機(jī)IO為順序IO

其實(shí)MySQL針對上面的優(yōu)化方法有對應(yīng)的算法:

Simple Nested Loop Join 最普通的循環(huán),這個(gè)要避免

Block Nested Loop Join 主要是針對t2表上沒有索引,在步驟2將t2中的每一行數(shù)據(jù)跟join buffer數(shù)據(jù)做對比,這樣將磁盤操作轉(zhuǎn)為內(nèi)存操作進(jìn)行比較,但是如果被驅(qū)動表的數(shù)據(jù)比較大的話,也影響性能,主要是cache pool被占滿,導(dǎo)致MySQL性能下降

Index Nested Join 就是都通過主鍵進(jìn)行查找關(guān)聯(lián),這種性能比較好

Batched Key Access Join 這個(gè)是 Index Nested Join上做的優(yōu)化,因?yàn)榛乇淼拇嬖?,隨機(jī)操作io也很耗費(fèi)性能,這個(gè)算法的核心在于通過輔助索引去查找時(shí),將得到的主鍵進(jìn)行排序,然后按照主鍵遞增的順序進(jìn)行查找,對磁盤的讀接近順序讀,從而優(yōu)化性能

到底要不用Join

從上面的分析我們可以看到,用Join還是可行的,只要性能可控且在接受范圍內(nèi),還是能減少代碼復(fù)雜度的。需要避免的是join的表沒有索引,不然這樣的SQL發(fā)線上是災(zāi)難性的。

總結(jié)

Join還是可以大膽的使用,只要把握好幾個(gè)原則:

1、盡量讓join的列是索引列,而且最好是類型相同,盡可能是主鍵索引;

2、盡量將小表做驅(qū)動表(這一點(diǎn)MySQL在5.6某個(gè)版本后能自動完成);

3、養(yǎng)成將寫好的SQL進(jìn)行explain的好習(xí)慣,觀察SQL的執(zhí)行過程。

看完上述內(nèi)容,你們對MySQL中Join的執(zhí)行過程有哪些有進(jìn)一步的了解嗎?如果還想了解更多知識或者相關(guān)內(nèi)容,請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。

網(wǎng)頁標(biāo)題:MySQL中Join的執(zhí)行過程有哪些
本文網(wǎng)址:http://aaarwkj.com/article48/gpjdep.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)建站公司、企業(yè)建站商城網(wǎng)站、定制開發(fā)、網(wǎng)頁設(shè)計(jì)公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)
十八岁毛片一区二区三区| 少妇高潮一区二区三区在线| 日本东京热二三四区不卡免费的| 日韩精品有码在线视频免费观看| 日韩精品在线观看天堂| 国产成人免费自拍一区| 涩久久悠悠一区二区三区| 国产日韩欧美一区综合| 中文字幕国产精品综合| 微拍福利一区二区三区| 亚洲精品日韩国产av| 国产中文字幕有码视频| 国产美女高潮流白浆视频免费看| 国产三级无遮挡在线观看| 久久精品国产亚洲夜色av网站| 午夜一区二区三区精品| 国产高清大片一级黄色| 97国产精品视频在线观看| 欧美日韩精品人妻二区| 少妇欧美日韩精品在线观看| av一区二区三区三| 久久免费看少妇高潮av| 亚洲一区二区三区在线播| 欧美一区二区黑人巨大| 久娜娜精品视频在线观看| 国产成人性生交大片免费| 日韩一二区不卡在线视频| 国产交换精品一区二区三区| 亚洲欧美综合日韩综合久久久| 国产视频一区2区三区| 18禁超污网站免费观看| 一本久道久久综合狠狠老| 国产原创av超爽剧情系列 | 五月婷久久精品国产亚洲av| 一区二区三区乱码国产| 亚洲av午夜福利麻豆av| 久久精品亚洲天然东京热| 中文字幕在线一级色视频| 亚洲欧美一区二区色慰| 婷婷中文字幕在线视频| 亚洲国产熟女一区二区三|