Mybatis的N+1select问题

对于N+1问题,刚开始看到这个名词会让人很懵,这个关系到数据表关联关系,一对多,多对多的情况,这个问题在使用mybatis或者hibernate都有可能遇到,select语句数量过多或者重复的情况下,就会出现这个问题,频繁发送相同的sql语句给数据库带来很大压力

说说解决方案:
1.使用sql语句:
基本的查询语句select name age from user_info where id=2;
最直接的使用,也是我的平时使用量最大的,但是当遇到有外键关联的时候,
就应该使用join去连接查询:
select a.uname d.salary from user_info ui left join department d on ui.uid=d.id
关于join连接:
两张关联表,左表和右表
left join 获取左表所有数据,再取右表能与左表匹配的数据为结果
right join 与上面left 相反,取右表所有数据,左表与之匹配
inner join 与join差不多,就是取两表相交叉的匹配结果
2.MyBatis处理N+1问题的途径,可以使用延迟加载

<configuration>  
    <settings>  
     <setting name="cacheEnabled" value="true"/>  
     <setting name="lazyLoadingEnabled" value="true"/>  
     <setting name="aggressiveLazyLoading" value="false"/>  
    </settings>  
    <environments default="development">  
.......  
</configuration>

cacheEnabled: 开启mybatis缓存
lazyLoadingEnabled: 延迟加载的全局开关。当开启时,所有关联对象都会延迟加载
aggressiveLazyLoading:
当启用时,对任意延迟属性的调用会使带有延迟加载属性的对象完整加载;反之,每种属性将会按需加载

在对多对多表操作的时候,Mybatis一般都会使用association,collection这两个标签,这里一个fetchType属性:可以自己按需要设置加载策略
eager:即刻加载
lazy: 延迟加载

参考:

http://blog.csdn.net/ykzhen2015/article/details/51364906
http://blog.csdn.net/z69183787/article/details/46288815

猜你喜欢

转载自blog.csdn.net/zoeou/article/details/65470375
今日推荐