关于 MySQL,limit 1 的机制问题
出现的情景
以下有两条 sql 语句,第一条
SELECT * FROM g_1242_award where a_uid = 0 and a_start < 1576215393 and a_awardid in (3,4);
查询结果如下
另外一条
SELECT * FROM g_1242_award where a_uid = 0 and a_start < 1576215393 and a_awardid in (3,4) limit 1;
查询结果如下
可以看到,第一条 sql 查询出来的第一条数据,主键为 2
的数据!
为何增加 limit 1
条件后,会查询出主键为 20
的数据?
疑问
从查询出的数据来理解,加了 limit 条件之后,mysql 对 a_award_id
字段进行了排序,然后 取出了第一条数据!这是 mysql 底层做的处理吗?为何是这样的处理呢?
加一个排序不就好啦
按最后一个条件进行排序了
1、把创建表的代码贴出来,并附上测试时的数据内容
2、请查看执行计划与EXPLAIN
把创建表的代码贴出来,并附上测试时的数据内容
这是mysql优化器的把戏,你不懂它,它就玩你。
使用order by那么mysql会开辟一块叫做sort_buffer的内存空间,专门用来做排序。也就是说mysql扫描完了之后,对满足条件的数据做排序。然后这个时候order by limit 1获取的数据,和使用了order by之后出现的第一条数据相同。因为排序的原因。
当没有order by和limit的时候,那就是直接把满足条件的数据装进结果集里面。至于为什么是主键20这条数据成为了结果集的第一条数据,那么还得借用explain来分析分析了。因为帖子中现有的数据无法分析出来,但可以推测一下是索引起了作用。
部分知识点来源于mysql8,但放心和mysql5.7一样
explain语句如下

@L学习不停