python

当Limit没有order by

文章暂存

systemime
2020-07-28
3 min

摘要.

# 两段没什么问题是SQL

SELECT
		`a`.*,
    `b`.`name` AS `xxx_name`,
    ...
    FROM `axx` AS `a`
    LEFT JOIN `xxx` AS `b`
    ON `a`.`xxx`=`b`.id
    WHERE `status`=0
    LIMIT 0, 10;


SELECT
		`a`.*,
    `b`.`name` AS `xxx_name`,
    ...
    FROM `axx` AS `a`
    LEFT JOIN `xxx` AS `b`
    ON `a`.`xxx`=`b`.id
    WHERE `status`=0

看起来第一段sql仅仅比第二段sql多了一个limit对不对,如果你在你的终端里执行,大概率也是得到相同的结果
(上下文默认InnoDB数据库引擎

初始查询时order by等条件默认为空,用户操作传入各种查询排序条件


在线上环境中,这两段落sql分别服务于某数据的分页展示和数据导出,然而问题来了
image.png

开始进行问题定位,一番查找,找到两篇资料,解决了我的疑惑

https://www.zhihu.com/question/24315588 https://learnku.com/articles/25270 (https://github.com/XiaoMi/soar/blob/master/doc/heuristic.md)

# 故障原因

上图吧

  • 小米:启发式规则建议

image.png

image.png

结合两篇文章内容可以看出,mysql在使用InnoDB时,如果没有默认的order by,则不会使用主键,将会使用默认的where具有索引顺序的字段进行排序分页,同时,没有指定order by最终查询结果取决于查询执行计划

上次编辑于: 5/20/2021, 7:26:49 AM