Mybatis--dao层涉及并表查询sql较高效写法

本文探讨了如何利用MySQL 8的WITH TABLE AS语句提高性能,通过临时表减少子查询对大编码集的耗时,针对父编码表与子编码表的并表操作,实现场景下编码匹配的高效查询。重点介绍了EXISTS函数在优化编码匹配查询中的应用。

场景:比如有个父编码总表与子编码表,需要进行并表,将父编码与子编码通过对应的业务逻辑,筛选合并成同一列编码,为了提高一些性能效率,可以用mysql8的新特性 with table as 语法,先定义一个临时表table1,然后拿到过滤后的父子项编码之后,将结果集放到另外一个最终的业务问题单表C 中进行编码匹配,因为表C中,也有该编码字段,筛选出只存在临时表中的编码的问题单数据条目。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.app.it.dao.appDao">
   //自定义临时表
	<sql id="common">
		with table1 as (
			select A.code code,B.item item from A left join B on a.code=b.code
		)
	</sql>
    
    <select id="gettable" resultType="com.app.it.vo.codeVO">
        <include refid="common"/>
        select 
            C.NO   no,
            C.NAME name,
            C.CODE code,
            ......
         from C
         where EXISTS(select code from table1 where table1.code=C.code)
    </select>
</mapper>

 这里还用到了一个EXISTS函数,作用效果与 IN 相似。

当子查询结果集很大,而外部表较小的时候,Exists的Block Nested Loop(Block 嵌套循环)的作用开始显现,并弥补外部表无法用到索引的缺陷,查询效率会优于IN

考虑到我们嵌套的子查询是匹配编码集,会比较耗时,建议使用EXISTS,具体似实际业务数据来判断

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值