国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

evin2016 / 2781人閱讀

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

今天有朋友問了我一個問題,說:

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

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

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

舉例說明:

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

這個sql的簡單流程如

  

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

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

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

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

user 基礎(chǔ)信息

uid username mobile
10 tree 110
11 Hot 112
userinfo 擴展信息

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

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

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

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

簡單的拆分過程如下:

先取出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 平常逗號隔開的串,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]

)

下面是重點:

循環(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ù)了。

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

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/20789.html

相關(guān)文章

  • Mysql - JOIN詳解

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

    glumes 評論0 收藏0

發(fā)表評論

0條評論

evin2016

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<