跳至主要内容

各数据库无order by时的默认排序

MySQL:
对于 MyISAM 表 ,Select 默认排序是按照物理存储顺序显示的。
而InnoDB 表,会按主键的顺序排列。
Oracle:
oracle对无order by的语句返回的结果不进行排序,oracle此时的处理方式是按照数据的物理存储顺序来读取数据。因为rowid是每行数据的地址,所以有时候看起来会像是使用rowid排序的。但这个顺序是可能被打乱的,在表的数据被删除后,rowid会被新插入的数据占用。所以一个无order by查询结果看起来也可能是个杂乱无章的。oracle的数据库实现就一个原则,怎么快怎么效率高就怎么来。大多数情况下不需要排序还非得按主键排序这不是浪费资源么?这和oracle的表结构是有关系的,因为oracle的表结构默认是按堆存放的。按堆存放的意思就是,随便存,存的时候就是乱序的。如果你建表的时候就是建的按索引组织的表,那么它返回的时候就会默认排序了。
sqlserver:
在不指定Order by的情况下,sqlserver会根据执行计划实际查询方式来得到数据,而执行计划会根据sql中很多的因素(的查询列,where条件,order by等)而使用不同的索引,最终出来的结果很可能是不同的。
DB2:

DB2的尚不清晰,排序好像与sort heap相关。

评论

此博客中的热门博文

【图集】言叶之庭(言の葉の庭)

隐约雷鸣 阴霾天空 但盼风雨来 能留你在此 隐约雷鸣 阴霾天空 即使天无雨 我亦留此地 ——万叶集 《言叶之庭》

关于Apache本地能访问外网不能访问的问题

在配置apache和tomcat时,把它们都配置好,放到服务器中发现外网不能访问 解决: I,可能是防火墙限制了。 1,首先启动Apache,在本地打开浏览器访问指定路径成功。 2,在系统的控制面板里打开防火墙设置,进入高级设置。 3,在高级设置里右键点击“入站规则”,选择“新建规则”。 4,在规则导向里,类型选“端口”,协议选“TCP”。 5,指定本地端口号“80”。(此处的80与Apache配置里指定的端口号要一致) 6,下一步的“操作”选择“允许连接”即可。 7,“配置文件”选择“域、专用、公用”即可。 8,“名称”和“描述”自定义,能识别即可。最后保存退出。 9, 无需重启apache II,也可能是配置出了问题 可能是配置中没有允许外部访问,则Apache服务器是2.4.0以上 版本,将虚拟主机的进行如下配置: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 < VirtualHost * :80 > < Directory " C: / www "> Options FollowSymLinks AllowOverride All Order allow,deny Allow from all Require all granted </ Directory > ServerAdmin xdfsfsffs@xd.com DocumentRoot "C:/www" ServerName www.test.com ServerAlias test.com ErrorLog "logs/test.bin-error_log" CustomLog "logs/test.bin-access_log" common </ VirtualHost >