关于 MySQL,limit 1 的机制问题

出现的情景

以下有两条 sql 语句,第一条

SELECT * FROM g_1242_award where a_uid = 0 and a_start < 1576215393 and a_awardid in (3,4);

查询结果如下

关于mysql,limit 1的机制问题

另外一条

SELECT * FROM g_1242_award where a_uid = 0 and a_start < 1576215393 and a_awardid in (3,4) limit 1;

查询结果如下

关于mysql,limit 1的机制问题
可以看到,第一条 sql 查询出来的第一条数据,主键为 2 的数据!

为何增加 limit 1 条件后,会查询出主键为 20 的数据?

疑问

从查询出的数据来理解,加了 limit 条件之后,mysql 对 a_award_id 字段进行了排序,然后 取出了第一条数据!这是 mysql 底层做的处理吗?为何是这样的处理呢?

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 6
lochpure

加一个排序不就好啦

4年前 评论
TYu (楼主) 4年前
VeryCool

按最后一个条件进行排序了

4年前 评论
TYu (楼主) 4年前
TYu (楼主) 4年前
VeryCool (作者) 4年前

1、把创建表的代码贴出来,并附上测试时的数据内容

2、请查看执行计划与EXPLAIN

4年前 评论

把创建表的代码贴出来,并附上测试时的数据内容

4年前 评论

这是mysql优化器的把戏,你不懂它,它就玩你。

使用order by那么mysql会开辟一块叫做sort_buffer的内存空间,专门用来做排序。也就是说mysql扫描完了之后,对满足条件的数据做排序。然后这个时候order by limit 1获取的数据,和使用了order by之后出现的第一条数据相同。因为排序的原因。
当没有order by和limit的时候,那就是直接把满足条件的数据装进结果集里面。至于为什么是主键20这条数据成为了结果集的第一条数据,那么还得借用explain来分析分析了。因为帖子中现有的数据无法分析出来,但可以推测一下是索引起了作用。

部分知识点来源于mysql8,但放心和mysql5.7一样

4年前 评论
TYu (楼主) 4年前
L学习不停 (作者) 4年前
TYu (楼主) 4年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!