一、前因
在mysql数据库中存储了100万数据,然后进行列表查询的时候发现相当慢,差不多要3-4秒左右才能查出来。
如上图
...就很离谱。
刚开始是真的没有思路,后来在网上查了一下,又问了一下gpt,但是感觉都不是我想要的结果。
虽然都实验了一下,但是都很繁琐,就很懒,嗯~ o(* ̄▽ ̄*)o
二、过程
找了好久,看大佬们说的都是什么 mybatis 的 流式查询 感觉很厉害的样子,然后我就照着给弄了一下,真难,没弄出来,他报错。/(ㄒoㄒ)/~~
于是所幸就直接堵死这条路,换个路,直接看看mybatis到底执行了个啥东东。
开启mybatis sql日志需要在log日志和 mybatis配置上加上如下配置(yml)
configuration: #log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
可以看到我这个是list列表,用了分页,所以可以看到他是执行了两条sql语句的,而且mybatis也直接给了提示的。 所以说我先头的方向就可能不对 /(ㄒoㄒ)/~~
因为用了分页所以这里mybatis给生成了一条语句,去查询了我们数据的总数,就是这里耗费了大量的时间。
终于,找到了问题原因,那就好解决了。
在网上搜了一下,然后发现都好繁琐,一下我就不想动了。
然后我就搜到了一位大佬的方法,下面链接
https://blog.csdn.net/qq_41972951/article/details/127494932
该说不说,大佬的是真的香,简洁明了
下面是一个模板,可以直接cv过去用。
<select id="getByList" resultMap="HlDepotHeadResult">
//你的查询数据的语句,正常用就好
select * from test_007 where del_flag = 0 and type = #{type}
</select>
<select id="getByList_COUNT" resultType="java.lang.Long">
//自定义的查询总数的语句 type 你上面怎么用的这个怎么用就可以了
select count(0) from test_007 where del_flag = 0 and type = #{type}
</select>
用这种方法,数据从原先的2-3s直接进入了500ms以内
最后,可以将查出来的总数存入redis中,这样下次查询的时候可以选择先走redis的,这样第一次会相对慢一些,剩下的访问基本上可以做到200ms。
如果可以也可以弄一个记录表信息的表,然后直接从里面查(不过我还没试过)可以根据情况自行选择。
总结: 大佬东西真的香。而懒可以激发潜能,( •̀ ω •́ )y