摘要:有挫敗感,故現在把聯表的拆分寫一篇文章。在最開始,先解釋一年的聯表查詢的機制?,F在又三張表基礎信息擴展信息銀行存款現在需要取出每個會員的基本信息,擴展信息以及銀行存款。最好的辦法就是對這個進行拆分。
今天有朋友問了我一個問題,說:
有四張表,他要從四張表里面取數據,他已經設計好了數據冗余等等,但還是需要通過聯表查詢來獲取數據,問我有沒有比較好的解決辦法。說了挺長時間,朋友沒聽明白。有挫敗感,故現在把聯表的拆分寫一篇文章。
在最開始,先解釋一年mysql的聯表查詢的機制。
當前 mysql 執行的關聯策略很簡單:mysql對任何關聯都執行嵌套循環關聯操作,即:Mysql先在一個表中取出單條數據,然后在嵌套到下一個表中尋找匹配的行,依次下去,直到找到所有表中匹配的行為止,然后根據各個表匹配的行,返回查詢中需要得各個列。mysql會嘗試在最后一個關聯表中找到所有匹配的行,如果最后一個關聯表無法找到更多的行以后,mysql返回到上一層次關聯表,看能否能夠找到更多的匹配記錄。一次類推迭代執行。當然實際的mysql操作沒這么簡單,這里只是說一個大概的流程。
舉例說明:
現有一個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.rowwhile 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.nextend
outer_row = outer_iter.next
end
回歸正題,因為mysql的這種機制和其他數據庫的hash配對不一樣,效率比較低,所以要盡量避免使用聯表查詢來獲取數據,而且mysql在設計上讓連接和斷開連接都很輕量級,在返回一個小結果很高效。
現在說一下怎么拆分sql。
現在又三張表:
user 基礎信息
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
現在需要取出每個會員的基本信息,擴展信息以及銀行存款。如果用聯表查詢的話,你可能寫出這樣的語句
select * from user left join userinfo on user.uid=userinfo.uid left join money on user.uid=money.uid
實際情況中可能比這個要復雜的多,數據量越大這條sql可能問題越大。尤其在高并發的情況下更糟糕。最好的辦法就是對這個sql進行拆分。
簡單的拆分過程如下:
先取出user表中的數據,取出結果為(模擬php取出過程)
user => array(
0 -> [ uid:10,username:tree,mobile:110]
1-> [uid:11,username:hot,mobile:112]
)
然后取出userinfo里面的數據:
userinfo => array(
0 -> [uid:10,qq:123,weibo:tree.blog]
1-> [uid:11,qq:456,weibo:hot.blog]
)
然后循環 user數組,將uid 平常逗號隔開的串,10,11。將10,11用in查詢取出userinfo
接下來需要循環userinfo數組,用uid作為Key,變成如下格式:
userinfo => array(
10 => [uid:10,qq:123,weibo:tree,blog]
11 => [uid:10,qq:456,weibo:hot.blog]
)
下面是重點:
循環user數據,結果應該是這樣:
foreach($user as $key=>$row){
$user[$key]["qq"] = $userinfo[$row["uid"]]["qq"]; $user[$key]["weibo"] = $userinfo[$row["uid"]]["weibo"];
}
這樣就能取出所需要得數據了。
今天就先到這里。明天再補充一部分內容。這只是一個很簡單的介紹,這種思路可以延伸出很多不同的用法.
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/20789.html
摘要:如果之前對不同的執行結果沒有概念,可以結合這篇文章往下看的執行順序以下是查詢的通用結構它的執行順序如下語句里第一個被執行的總是子句對左右兩張表執行笛卡爾積,產生第一張表。 0 索引 JOIN語句的執行順序 INNER/LEFT/RIGHT/FULL JOIN的區別 ON和WHERE的區別 1 概述 一個完整的SQL語句中會被拆分成多個子句,子句的執行過程中會產生虛擬表(vt)...
閱讀 467·2023-04-25 23:00
閱讀 3496·2021-11-22 13:54
閱讀 1902·2021-10-27 14:14
閱讀 1489·2019-08-30 13:59
閱讀 3514·2019-08-23 16:15
閱讀 1961·2019-08-23 16:06
閱讀 3332·2019-08-23 15:26
閱讀 1261·2019-08-23 13:48