mysql中in大量数据导致查询速度慢,优化的名列前茅种方案是拆分sql子查询,将一条sql拆为两条sql,将in内部的sql拆分出来,取出isbn集合列表,然后利用mybatis的sql拼接的功能,拼成完整的sql语句。
一、mysql中in大量数据导致查询速度慢怎么优化
拆分sql语句
mysql中in大量数据导致查询速度慢,优化的名列前茅种方案是拆分sql子查询,将一条sql拆为两条sql,将in内部的sql拆分出来,取出isbn集合列表,然后利用mybatis的sql拼接的功能,拼成完整的sql语句。
Xml代码如下所示,名列前茅步首先利用时间参数分页取出isbn列表
<select id=”findIsbnBetweenTime” >
SELECT `isbn` FROM `tb_book_base` WHERE publish_time BETWEEN #{fromTime} AND #{toTime} LIMIT #{offset},#{size}
</select>
第二步先在服务层中判断上一轮取出的isbn列表是否为空,如果不为空继续向下执行,如果isbn集合列表不为空,继续利用mybatis提供的xml动态标签功能,拼接出in查询条件
<select id=”findBookMain” resultType=”com.lantian.db.model.BookMain”>
SELECT * FROM `tb_book_main` WHERE `isbn` IN (
<foreach collection=”list” item=”isbn” separator=”,”>
#{isbn}
</foreach>
)
</select>
联结代替子查询
这种方案原理还是避免子查询,将子查询语句改写为联结查询,改写后的sql语句如下所示
SELECT
t1.`isbn`,
`code`
FROM
tb_book_main t1
INNER JOIN
( SELECT `isbn` FROM tb_book_base WHERE `publish_time` BETWEEN 20190903 AND 20191003 ) t2
on t1.`isbn` = t2.`isbn`
AND `role`= 100
limit 0,10
使用explain查看索引命中情况,mysql按照预期命中了tb_book_base的publish_time和tb_book_main的isbn索引
延伸阅读:
二、什么是Memory引擎
Memory引擎是Mysql的内存引擎,在实现上,Memory存储引擎不同于Innodb这种组织索引结构(索引即是数据,即数据存放在主键索引上),而是将索引和数据分开存储。索引采用Hash的形式,存放主键id和指向数据的指针,而数据则按插入顺序存放。我们称这种数据组织方式为堆组织方式。