场景:比如有个父编码总表与子编码表,需要进行并表,将父编码与子编码通过对应的业务逻辑,筛选合并成同一列编码,为了提高一些性能效率,可以用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,具体似实际业务数据来判断
本文探讨了如何利用MySQL 8的WITH TABLE AS语句提高性能,通过临时表减少子查询对大编码集的耗时,针对父编码表与子编码表的并表操作,实现场景下编码匹配的高效查询。重点介绍了EXISTS函数在优化编码匹配查询中的应用。
3万+

被折叠的 条评论
为什么被折叠?



