记录一次数据类型错误导致索引失败的问题

问题描述

        在一次压测中发现,代码中有一步查询mysql的时间过长,甚至达到了几十秒。该查询操作本身很简单,就是一个按主键查询,mapper中语句如下:

<select id="select" parameterType="java.lang.Integer">
    select * from tb
    where XX = #{XX,jdbcType=INTEGER}
</select>

原因分析:

        首先检查了数据库,该主键是加了索引的。而且库内的数据量不算太大。

        之后,在压测过程中,手动执行sql语句,发现耗时不大。一度怀疑是程序连接池问题。

        最后突然发现,手动执行的sql是:

select * from tb where XX = "XX"

        加了引号,也就代表是按字符串类型去查询的,而程序是按照数字类型查询的。

        再次检查建表语句,发现该值是字符串类型,所以只有按字符串类型查询,索引才会生效。按数字类型查询,索引不生效,所以耗时很大。


解决方案:

        知道了问题所在,修改就很简单了,把mapper中的类型改为VARCHAR:

<select id="select" parameterType="java.lang.String">
    select * from tb
    where XX = #{XX,jdbcType=VARCHAR}
</select>

        索引生效,性能百倍提升!


经验总结:

顺便学习一下索引不生效的几种原因,以后工作中要多多注意。

https://blog.csdn.net/qq_16504067/article/details/125103336

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值