有關mysql聯表的拆分

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

有四張表,他要從四張表裏面取數據,他已經設計好了數據冗餘等等,但仍是須要經過聯表查詢來獲取數據,問我有沒有比較好的解決辦法。說了挺長時間,朋友沒聽明白。有挫敗感,故如今把聯表的拆分寫一篇文章。mysql

在最開始,先解釋一年mysql的聯表查詢的機制。sql

當前 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.rowui

while outer_row設計

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

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的這種機制和其餘數據庫的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'];

}

這樣就能取出所須要得數據了。

今天就先到這裏。明天再補充一部份內容。這只是一個很簡單的介紹,這種思路能夠延伸出不少不一樣的用法.

相關文章
相關標籤/搜索