首页 > 开发 > MySQL > 正文

mysql的MYISAM引擎中有没有sequence id,为什么没有指定order by的时候顺序会打乱

2017-09-08 09:12:09  来源:网友分享

我想到这个问题是从观察mysql的自然排序状态引发的,我们用的很多mysql管理软件,在列出表数据时一般都用的以下代码

SELECT * FROM table_name LIMIT x OFFSET y

这个时候没有指定任何排序字段,那么在mysql内部就应该有一个类似oracle或者pgsql里面sequence id的东西,做为它的默认索引来实现排序之类的东西。但我从来没看到有人提过mysql有这个玩意。

另一个佐证是如果你指定了一个自增id作为主键,在我们预想中如果执行上面的语句,主键的排序顺序应该一致,实际上并不是这样,虽然大部分是一致的,但是有少部分会打乱。因此他一定有一个内部的排序机制,这个机制是什么?

解决方案

单说MyISAM吧。 MyISAM的数据和索引是分开的,当你执行一个简单的select *的时候,按照的就是数据在磁盘上的排列顺序(你可以把这个顺序理解为sequenceid)。 但是必须指出的是,数据空间是会复用的,也就是说当你在插入一行数据的时候,如果前面被删除的区块有合适空位,就会放到这空位中。 因此select *并不保证是按照插入顺序。 不知道这么说有木有清楚。。。