mysql优化实践之distinct和模糊查询一起使用的慢查询优化

场景:tableX中有60W条数据
原sql:模糊匹配加去重
SELECT DISTINCT up_stream
FROM tableX
WHERE down_stream
LIKE ‘%疫苗%’ AND (save_flag is null or save_flag = ‘’) AND is_deleted = 0

这条SQL耗时大概7秒左右,使用分页插件后会更慢,查询索引类型为index

调优过程:
控制变量法:
方案一:去掉该SQL中的DISTINCT后该SQL耗时0.8秒,但不能满足去重需求,查询类型为全表扫描。
方案二:去掉该SQL中模糊查询前面的%后该SQL耗时0.3秒,但查询结果不完整,查询类型为range。

此时思考问题,为什么方案一与原SQL对比走了索引却慢了那么多,这一点我暂时不知道为啥。

此时我感觉自己没办法去优化这条SQL了,但是我仍然相信一定有决绝办法,然后继续百度,最后终于找到了一篇博客https://blog.csdn.net/went_m/article/details/79815411?utm_medium=distribute.pc_relevant.none-task-blog-searchFromBaidu-7.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-searchFromBaidu-7.control

解决思路:引用了上文博客中的思想
先不distinct,而是将数据范围缩小,只取down_stream与“疫苗”有关的数据,然后用这部分数据作为一个表与原表自身join,对很少量的数据进行distinct ,性能大大提升。

优化后的SQL:

SELECT DISTINCT B.up_stream
FROM tableX A
JOIN
(SELECT id, up_stream FROM tableX WHERE down_stream LIKE ‘%疫苗%’ AND (save_flag is null or save_flag = ‘’) AND is_deleted = 0 ) B
ON A.id = B.id

做java快两年了,最近写代码开始考虑性能问题了,希望我的经验对初入职场的小伙伴有帮助,嘿嘿!然后文中提到的问题有没有大佬看看 --> 文中问题 “此时思考问题,为什么方案一与原SQL对比走了索引却慢了那么多,这一点我暂时不知道为啥”, 这个问题有木有数据库大佬解释一下。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值