有关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'];

}

这样就能取出所须要得数据了。

今天就先到这里。明天再补充一部份内容。这只是一个很简单的介绍,这种思路能够延伸出不少不一样的用法.

相关文章
相关标签/搜索