今天咱来个简单粗暴的,直入主题,请看题目的灵魂拷问。
如题
现在数据库设计越来越规范了,一般的表都会要求加上自增id作为物理主键,用在一些像是分页查询的场景,确实能极大提高效率。那么问题来了,如果我们的sql不指定排序,查询出来的数据会是按自增id默认排序的么?
答案自然是否定的,要不我就不会写这篇文章了
![2c267ae931566828e389441f86ddd64d.png](https://img-blog.csdnimg.cn/img_convert/2c267ae931566828e389441f86ddd64d.png)
其实这么说也不完全准确,有时候还是能按顺序排的,那么与什么有关呢?
我们要掌握这个问题的精髓,默认顺序其实是按实际磁盘的物理存储顺序排的,看到这里很多读者就明白了,那就是说自增id顺序其实不一定是实际的物理存储顺序呗!
![c2c579ce169ceedf91c6acd438401673.png](https://img-blog.csdnimg.cn/img_convert/c2c579ce169ceedf91c6acd438401673.png)
在不删不改的情况下,自增id和物理顺序是一致的,但实际场景不可能这样,再加上程序员大佬们就喜欢搞些骚操作,假如初始写入十条数据,后来把第一条数据删了,然后再插入一条,那么查询的时候这一条是在最开始还是最后呢,其实很可能是在最开始,当然我们期望他是在最后,因为他是自增id最大的,但数据库引擎优化可能会考虑利用之前删除的那块空间,把新数据填入,其实就是一种碎片优化策略,这样就导致自增id和物理存储顺序的不完全一致!
![6d2ada7c64dca7f562544f03875feb1e.png](https://img-blog.csdnimg.cn/img_convert/6d2ada7c64dca7f562544f03875feb1e.png)
因此,如果我们需要查出来的数据是按自增id排序的,别忘了加上排序条件,这就又引出另一个问题,加上order by id后索引可能会出问题,经常走不到合适的索引了,只用了主键索引,关于这个深层次原因其实歪哥也没有搞特别清楚,数据库引擎优化的东西可能只有资深DBA能hold住吧,所以我们使用的时候一定要多留心,注意看下执行计划,不行就再加个带id的索引。
小小的数据库其实学问很多,我有点理解为啥要设置一个专门的DBA岗位了,大家感兴趣可以找点专门的数据库方面的书籍资料来看看,肯定会受益良多,歪哥也需要多补补课啦,哈哈
留言区
![a602416a7e7cfc01561b18b2a0f863f1.png](https://img-blog.csdnimg.cn/img_convert/a602416a7e7cfc01561b18b2a0f863f1.png)