开发者社区> 问答> 正文

关于MySQL排序原理的讨论

今天发现一个比较有意思的现象:我在查询mysql表的时候,语句是这样写的:SELECT * FROM sku_info查询出来的数据是按照自增列展示的,但是再加一个查询条件后:SELECT * FROM sku_info WHERE sku_info.sku_no = 'S223'在命中多条记录的情况下,展示顺序就可能是按自增列倒序排列的,这个查询条件字段是有索引的,但我明白其中的原理,谁能提点一下吗?

展开
收起
景凌凯 2020-04-22 17:57:57 1376 0
1 条回答
写回答
取消 提交回答
  • 有点尴尬唉 你要寻找的东西已经被吃掉啦!
    • 首先,不能依赖 MySQL 的默认排序,它是不可靠的,如果相关排序需要加上 order by。同时,需要注意的是,order by 后的字段的值是相同的,还是可能出现乱序,这个时候再加上分页,就默默地给系统埋下 BUG 啦。所以,需要再加一个字段来排序。例如,select * from tbl order by prior desc, id asc 。
    • 其次,回到你的问题,大部分时候,索引都是在磁盘上的写入顺序。一般情况下,不加 order by 语句的时候,MySQL 会索引顺序扫描,那么此时默认按照主键 ID 排序。使用了索引,则查询结果按照索引字段排序。此时,如果是复合索引的话,会按照复合索引字段逐个排序。换句话说,通常情况下,BTree 的结构保证了有序性。但是,频繁操作表,例如把数据不停无序删除然后再无序新增,导致其分裂,或者这个查询是一个大查询而产生临时文件,这种没有强制的外部排序,肯定会无序的。
    • 最后频繁操作导致无序有待商榷,该条sql用到了索引没有order by的话就是索引序,当不用 order by的时候如果出现加了新的索引导致sql选择了更合适的索引的时候可能出现意外的顺序,就是和之前的顺序不一样 如果业务上依赖这个顺序可能会有问题
    2020-04-22 17:58:32
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像