添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

一、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`

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和指向数据的指针,而数据则按插入顺序存放。我们称这种数据组织方式为堆组织方式。