一些有意思的sql性能问题及解决方法

9166166-4b797789d88220c9.jpg
sql.jpg

本人以前主要做移动端开发,较少使用sql,哪怕用也只是小数据量的简单sql增删改查。最近几个月被拉来做.net开发,于是不得不面对后台数据库操作的问题,这几天遇到了一些sql查询慢的问题,所幸都得到了优化。这里记录下:

一、concat导致全表扫描

准确的讲,应该是concat导致索引无效,从而导致全表扫描。
情况是这样的:单表100万+数据,有一Date和Time字段,需要做时间判断,取某个时间段以内的记录。
于是,使用concat很快就实现了查询的sql,如下:

// 问题sql
SELECT * FROM `sys_record` 
        WHERE '2018-08-19 10:10:00' <= CONCAT(`Date` ," ", `StartTime`) 
        AND '2018-10-20 22:20:50' >= CONCAT(`Date`," ",`StartTime`)   LIMIT 0, 10

开始执行...居然超过15秒才看到结果,明明才找10条数据,花这么长时间,绝对忍受不了。
于是,开始考虑优化,Date字段是带有索引的,于是就有了一条有意思的sql:

// 优化后
SELECT * FROM `sys_record` 
    WHERE  '2018-08-19' <=`Date` 
        AND '2018-10-20' >=`Date` AND
        '2018-08-19 10:10:00' <= CONCAT(`Date` ," ", `StartTime`) 
        AND '2018-10-20 22:20:50' >= CONCAT(`Date`," ",`StartTime`) LIMIT 0, 10

与上面的sql比较,只是多了看似多余的两句,但是执行查询后,5毫秒就出结果了,执行速度提升了几千倍,这都是索引起到的作用,加了前面两句,索引字段Date先起到了范围过滤的作用,所以查询速度快,而之前的sql语句,由于使用concat函数拼接Date和StartTime,导致Date索引起不到效果,所以查询速度慢

看似多余的查询条件,居然让sql执行效率优化三千倍(15s -> 0.005s),这都是索引的功能

二、少一个空格,执行时间多万倍

SELECT SQL_NO_CACHE * FROM `sys_record` WHERE _ID > 100000
SELECT SQL_NO_CACHE * FROM`sys_record` WHERE _ID > 100000

这两条sql是在SQLyog上执行时发现的,乍一看,没什么区别,但是执行速度却大不相同,同一个库,100万数据,前一条执行毫秒级,后一条居然执行20s+,总数1min+,这两条sql性能差异的原因暂不清楚。
第二条from和表名之间无空格,能正常执行?难道执行多花的时间是用在做错误兼容处理吗?所学有限,希望知道原因的朋友能解答下。
原文:简书ThinkinLiu 博客: IT老五

ps:刚接触一样东西,总会遇到一些有意思的东西,其实还有一些有意思的sql,只是忘记记录了。如果你也遇到过类似的问题,欢迎指导,力争少碰点坑,多点优化。

9166166-931fd471780b7e64.jpg
IT老五(it-lao5):关注公众号,一起源创,一起学习!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

flybirding10011

谢谢支持啊999

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值