MySQL的Join到底能不能用
經(jīng)常聽到2種觀點(diǎn):
網(wǎng)站制作、網(wǎng)站建設(shè)的關(guān)注點(diǎn)不是能為您做些什么網(wǎng)站,而是怎么做網(wǎng)站,有沒(méi)有做好網(wǎng)站,給創(chuàng)新互聯(lián)公司一個(gè)展示的機(jī)會(huì)來(lái)證明自己,這并不會(huì)花費(fèi)您太多時(shí)間,或許會(huì)給您帶來(lái)新的靈感和驚喜。面向用戶友好,注重用戶體驗(yàn),一切以用戶為中心。
其實(shí)對(duì)于上面的觀點(diǎn)一定程度上是正確的,但不是完全正確。但之所以流傳這么廣,主要還是沒(méi)有搞清楚實(shí)際狀態(tài),而根據(jù)實(shí)際使用中總結(jié)出來(lái)的一些模糊規(guī)律。只有了解的MySQL的Join實(shí)際執(zhí)行方式,就會(huì)知道上面2種觀點(diǎn)是一種模糊的規(guī)律,這種規(guī)律并不能指導(dǎo)我們實(shí)際開發(fā)。下面就說(shuō)說(shuō)MySQL的實(shí)際join執(zhí)行方式。
join可以說(shuō)一種集合的運(yùn)算,比如left join,right join,inner join,full join,outer join,cross join等,這些集合間的計(jì)算關(guān)系對(duì)應(yīng)在高中數(shù)學(xué)集合里面的交集,并集,補(bǔ)集,全集等。但在實(shí)際的代碼中,join運(yùn)算基本上是通過(guò)多層循環(huán)來(lái)實(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í)行步驟如下:
基本上先遍歷t,1,然后根據(jù)t1中的每行數(shù)據(jù)中的username,去表t2中查找滿足條件的記錄?;揪褪?層循環(huán)。
從上面可以看出,join本質(zhì)是循環(huán),這里的開銷如下:
從上面的步驟可以看出,優(yōu)化方向:
優(yōu)化的基本方法:
Batched Key Access Join 這個(gè)是 Index Nested Join上做的優(yōu)化,因?yàn)榛乇淼拇嬖?,隨機(jī)操作io也很耗費(fèi)性能,這個(gè)算法的核心在于通過(guò)輔助索引去查找時(shí),將得到的主鍵進(jìn)行排序,然后按照主鍵遞增的順序進(jìn)行查找,對(duì)磁盤的讀接近順序讀,從而優(yōu)化性能
從上面的分析我們可以看到,用Join還是可行的,只要性能可控且在接受范圍內(nèi),還是能減少代碼復(fù)雜度的。需要避免的是join的表沒(méi)有索引,不然這樣的SQL發(fā)線上是災(zāi)難性的。
Join還是可以大膽的使用,只要把握好幾個(gè)原則:
盡量讓join的列是索引列,而且最好是類型相同,盡可能是主鍵索引
盡量將小表做驅(qū)動(dòng)表(這一點(diǎn)MySQL在5.6某個(gè)版本后能自動(dòng)完成)
網(wǎng)頁(yè)名稱:一文搞懂MySQL的Join,聊一聊秒殺架構(gòu)設(shè)計(jì)
當(dāng)前地址:http://jinyejixie.com/article20/gggeco.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站排名、營(yíng)銷型網(wǎng)站建設(shè)、網(wǎng)站維護(hù)、域名注冊(cè)、網(wǎng)頁(yè)設(shè)計(jì)公司、搜索引擎優(yōu)化
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)