亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

有關(guān)mysql聯(lián)表的拆分

evin2016 / 2840人閱讀

摘要:有挫敗感,故現(xiàn)在把聯(lián)表的拆分寫一篇文章。在最開始,先解釋一年的聯(lián)表查詢的機(jī)制?,F(xiàn)在又三張表基礎(chǔ)信息擴(kuò)展信息銀行存款現(xiàn)在需要取出每個(gè)會(huì)員的基本信息,擴(kuò)展信息以及銀行存款。最好的辦法就是對(duì)這個(gè)進(jìn)行拆分。

今天有朋友問了我一個(gè)問題,說:

有四張表,他要從四張表里面取數(shù)據(jù),他已經(jīng)設(shè)計(jì)好了數(shù)據(jù)冗余等等,但還是需要通過聯(lián)表查詢來獲取數(shù)據(jù),問我有沒有比較好的解決辦法。說了挺長(zhǎng)時(shí)間,朋友沒聽明白。有挫敗感,故現(xiàn)在把聯(lián)表的拆分寫一篇文章。

在最開始,先解釋一年mysql的聯(lián)表查詢的機(jī)制。

當(dāng)前 mysql 執(zhí)行的關(guān)聯(lián)策略很簡(jiǎn)單:mysql對(duì)任何關(guān)聯(lián)都執(zhí)行嵌套循環(huán)關(guān)聯(lián)操作,即:Mysql先在一個(gè)表中取出單條數(shù)據(jù),然后在嵌套到下一個(gè)表中尋找匹配的行,依次下去,直到找到所有表中匹配的行為止,然后根據(jù)各個(gè)表匹配的行,返回查詢中需要得各個(gè)列。mysql會(huì)嘗試在最后一個(gè)關(guān)聯(lián)表中找到所有匹配的行,如果最后一個(gè)關(guān)聯(lián)表無法找到更多的行以后,mysql返回到上一層次關(guān)聯(lián)表,看能否能夠找到更多的匹配記錄。一次類推迭代執(zhí)行。當(dāng)然實(shí)際的mysql操作沒這么簡(jiǎn)單,這里只是說一個(gè)大概的流程。

舉例說明:

現(xiàn)有一個(gè)sql語(yǔ)句:
select table-1.col1,table-2.col2 from table-1 inner join table-2 using(col3) where table-1.col1 in (5,6)

這個(gè)sql的簡(jiǎn)單流程如

  

outer_iter = select col1,col3 from tables-1 where col1 in(5,6)
outer_row = outer_iter.row

while outer_row

inner_iter = select col2,col3 from table-2 where col3 = ourer_row.col3

inner_row = inner_iter.row

while inner_row

   output [ outer_row.col1,inner_row.col2]

   inner_row = inner_iter.next

end

outer_row = outer_iter.next
end

回歸正題,因?yàn)閙ysql的這種機(jī)制和其他數(shù)據(jù)庫(kù)的hash配對(duì)不一樣,效率比較低,所以要盡量避免使用聯(lián)表查詢來獲取數(shù)據(jù),而且mysql在設(shè)計(jì)上讓連接和斷開連接都很輕量級(jí),在返回一個(gè)小結(jié)果很高效。

現(xiàn)在說一下怎么拆分sql。

現(xiàn)在又三張表:

user 基礎(chǔ)信息

uid username mobile
10 tree 110
11 Hot 112
userinfo 擴(kuò)展信息

uid qq weibo
10 123 Tree.blog
11 456 hot.blog
money 銀行存款

uid money
10 10000
11 20000
現(xiàn)在需要取出每個(gè)會(huì)員的基本信息,擴(kuò)展信息以及銀行存款。如果用聯(lián)表查詢的話,你可能寫出這樣的語(yǔ)句

select * from user left join userinfo on user.uid=userinfo.uid left join money on user.uid=money.uid

實(shí)際情況中可能比這個(gè)要復(fù)雜的多,數(shù)據(jù)量越大這條sql可能問題越大。尤其在高并發(fā)的情況下更糟糕。最好的辦法就是對(duì)這個(gè)sql進(jìn)行拆分。

簡(jiǎn)單的拆分過程如下:

先取出user表中的數(shù)據(jù),取出結(jié)果為(模擬php取出過程)

user => array(

0 -> [ uid:10,username:tree,mobile:110]

1-> [uid:11,username:hot,mobile:112]

)

然后取出userinfo里面的數(shù)據(jù):

userinfo => array(

0 -> [uid:10,qq:123,weibo:tree.blog]

1-> [uid:11,qq:456,weibo:hot.blog]

)

然后循環(huán) user數(shù)組,將uid 平常逗號(hào)隔開的串,10,11。將10,11用in查詢?nèi)〕鰑serinfo

接下來需要循環(huán)userinfo數(shù)組,用uid作為Key,變成如下格式:

userinfo => array(

10 => [uid:10,qq:123,weibo:tree,blog]

11 => [uid:10,qq:456,weibo:hot.blog]

)

下面是重點(diǎn):

循環(huán)user數(shù)據(jù),結(jié)果應(yīng)該是這樣:

foreach($user as $key=>$row){

    $user[$key]["qq"] = $userinfo[$row["uid"]]["qq"];

    $user[$key]["weibo"] = $userinfo[$row["uid"]]["weibo"];

}

這樣就能取出所需要得數(shù)據(jù)了。

今天就先到這里。明天再補(bǔ)充一部分內(nèi)容。這只是一個(gè)很簡(jiǎn)單的介紹,這種思路可以延伸出很多不同的用法.

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/20789.html

相關(guān)文章

  • Mysql - JOIN詳解

    摘要:如果之前對(duì)不同的執(zhí)行結(jié)果沒有概念,可以結(jié)合這篇文章往下看的執(zhí)行順序以下是查詢的通用結(jié)構(gòu)它的執(zhí)行順序如下語(yǔ)句里第一個(gè)被執(zhí)行的總是子句對(duì)左右兩張表執(zhí)行笛卡爾積,產(chǎn)生第一張表。 0 索引 JOIN語(yǔ)句的執(zhí)行順序 INNER/LEFT/RIGHT/FULL JOIN的區(qū)別 ON和WHERE的區(qū)別 1 概述 一個(gè)完整的SQL語(yǔ)句中會(huì)被拆分成多個(gè)子句,子句的執(zhí)行過程中會(huì)產(chǎn)生虛擬表(vt)...

    glumes 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

evin2016

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<