今天写出一个十分弱智的bug!

点击上方“java大数据修炼之道”,选择“设为星标”

优质文章, 第一时间送达

来源:www.cnblogs.com/supercj/p/10333918.html

上一篇:美女同事被开除了,因用了Insert into select语句!

今天写出一个十分弱智的bug,记录一下,提醒自己以后别这种犯错,不怕丢人哈~

在写一个分页查询记录的sql时,要根据添加的时间逆序分页输出,之前的写法是酱紫:

select
    record.a,
    y.c
from
    (
        select
            a,b
        from
            x
        order by timestamp desc
        limit 0,10
    ) record
left join y
on record.b = y.d;

因为一些新的需求,要在后面加一些where条件,limit操作不能在嵌套查询里面加了,于是乎把limit 0,10提出来放到最外面,结果order by还留在里面。

我当时想嵌套查询出来的record表已经按timestamp字段逆序排列了,再left另一张表,最终再limit出来的结果应该也是逆序的,但结果却很打脸,是正序的。

首先控制变量,代码回滚到之前,把后来加的各种逻辑都去掉,还原到上述sql,只把limit 0,10移到最后,发现timestamp是正序的,那么问题应该就出在这里了,与后来加的其他逻辑没有关系。

那么再试一下删掉limit操作,结果timestamp是无序的!

这不可能啊,于是认真看了下数据,发现一些规律,可能是按y表的自增id或created_at时间字段排序的(因为这两个字段是索引字段),那么到这里,我们至少可以得到一个简单的结论,就是联表查询结果,不是按照嵌套查询中的order by排序的,现在正向一看,确实不可能按这个排序,因为括号里面的逻辑对括号外是不可见的。

还有个问题,上述去掉limit后,最终不是按left join主表的顺序输出,按照我们常理想象,mysql是循环主表的记录去关联另一张表,那么输出的顺序应该还是主表的顺序啊,但结果却是按另一张表的字段排序的,这又是为什么呢?


去官方手册中找找线索,发现order by模块中有这么一句话。

再去limit模块中看一下

从以上两个截图中,我们可以发现一些端倪,limit操作会对查询有一些优化,查询到指定条数的数据,就可以提前结束了,比如我们本文中的left操作,拿到10条结果就结束查询线程,返回客户端。

我猜测,如果没有limit操作,反正全部都要join,可能mysql会对循环逻辑做一些优化,不一定要按主表来循环,思想类似于java编译中的重排序,也对应了上面截图中的那句话。

采用最简单、最粗暴的方式,直接把order by 和 limit操作放到最外面就ok啦,其实效率上并没有什么降低,只要索引建的合理即可。

推荐学习路线:

1、java学习路线全攻略(资料、视频、源码、项目实战)

2、【史上最强实战项目合集】java项目20套 +完整版java学习视频

推荐面试技巧:

1、面试时被质疑学历、年龄该怎么办?

2、如何应对面试官问你职业规划问题

3、面试的时候问:你的期望薪资多少?怎么谈?

4、面试官问,你有什么问题需要问我的吗?

5、给培训出来的Java程序员的一点建议,教你如何找工作

最近热文推荐:

1、看完这篇Redis缓存三大问题,保你能和面试官互扯。

2、Java中:如何把异常设计的更优雅?

3、面试:SpringBoot中的条件注解底层是如何实现的?

4、单怼多线程,60道面试题,你能答上几个?(附答案)

5、这21 个刁钻的HashMap 面试题,我把阿里面试官吊打了!

6、用 float 存储金额,老板说损失从工资里扣!

7、别用Date了,Java8新特性之日期处理,现在学会也不迟!

8、【收藏了】10分钟读懂进程线程、同步异步、阻塞非阻塞、并发并行

注:加群要求 微信学习交流群:

1、想学习JAVA这一门技术, 对JAVA感兴趣零基础,想从事JAVA工作的。
2、工作1-5年,感觉自己技术不行,想提升的
3、如果没有工作经验,但基础非常扎实,想提升自己技术的。
4、还有就是想一起交流学习的。

小编个人微信

(如果你有学习上不懂的问题、需要学习视频资源等;都可长按识别上方二维码添加小编为好友, 我将免费为你提供完整的学习路线和各种视频学习资源)

如果您觉得不错,请别忘了转发、分享、点赞让更多的人去学习, 您的举手之劳,就是对小编最好的支持,非常感谢!

如何您想进技术群交流,关注公众号在后台回复 “加群”,或者 “学习” 即可

著作权归作者所有,欢迎大家投稿 (投稿作者我会在公众号一一署名一并感谢

要加群的赶紧上车,请加我微信2782278837统一拉群

—写文不易,你的转发就是对我最大的支持—


看完本文有收获?请转发分享给更多有需要的人

关注 java大数据修炼之道

每天学习java技术,你想学的Java知识这里都有!

微信扫描二维码,关注我的公众号

写留言

喜欢就给个“在看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值