mysql分解关联

分解关联查询有时候是高性能查询的一种方案。在数据库中获取一张表的结果集,然后在应用程序做关联。例如表A(ID,name,age) B(ID,AID,COL1,COL2)

方案一

select * from a join b on a.id=b.aid where a.name='zhangsan';

方案二 把这个sql可拆分成

select * from a where a.name='zhangsan'; 
-- 得到3条数据,分别是id=1,2,3    
select * from b where b.aid in(1,2,3); 
-- 得到b表中的所有符合条件的数据
-- 最后应用层对查询出来的记录进行关联。

可能有人会觉得困惑,为什么不直接关联查询呢,简单粗暴,还不用多次连接数据库。事实上这种做法并没有错,但是关联查询使用内嵌循环的方式,如果数据量不是特别大的时候性能可能会比分解关联好,但是如果数据量非常大查询起来可能会非常慢,而且MySQL innodb不支持hash索引。如果把关联查询分解成单表查询,其实好处也是挺多的。

缓存的利用,单表的查询容易被应用程序缓存。
减少锁的竞争
在应用层做关联可以更容易对业务拆分,项目更容易拓展
MySQL innodb不支持hash索引,这相当于在应用层做hash关联

推荐文章