概述
业务中经常会对一些表进行聚合组装信息,然后筛选,有些表比较数据量大的时候,会对拖慢查询;
常用的mybatis
的分页查询,在查询时会先count
一下所有数据,然后再limit
分页,即使分页也会有深度分页问题;
在分页的时候一些大表的子查询都是重复的,而且每次的count
和查询对大表实际进行了2次
查询,可能mysql
的buffer pool
中会有缓存,但是非常影响查询速度;
在不使用其他中间件的情况下,优化sql
,有好几种方案;
临时表就是其中一种;
平时我们在join
子查询时,mysql
也会生成临时表,只不过是隐式的;
可以通过explain
分析sql
,在Extra
中可以看到use temporary
,就是使用了临时表(比如union
时);
临时表对mysql
的session
(一个tcp
连接)之间是互相隔离的;
如果应用中使用了db
连接池,那么连接之间的临时表是不共享的;
但是一个连接创建的mybatis
的sqlSession
之间是共享的临时表
我的mysql
版本:8.0.32
demo
CREATE TEMPORARY TABLE
IF not EXISTS test_tmp_table AS
SELECTid,time,num,sku
FROMtest_num
不同的mysql session
之间临时表是隔离的