摘要.
# 两段没什么问题是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分别服务于某数据的分页展示和数据导出,然而问题来了
开始进行问题定位,一番查找,找到两篇资料,解决了我的疑惑
https://www.zhihu.com/question/24315588 https://learnku.com/articles/25270 (https://github.com/XiaoMi/soar/blob/master/doc/heuristic.md)
# 故障原因
上图吧
- 小米:启发式规则建议
- 知乎回答:@mysqlops
结合两篇文章内容可以看出,mysql在使用InnoDB
时,如果没有默认的order by
,则不会使用主键,将会使用默认的where具有索引顺序的字段进行排序分页,同时,没有指定order by最终查询结果取决于查询执行计划