mysql - 性能 - MySQL 在插入记录时的默认排序顺序

标签 mysql database rdbms

mysql 中记录的默认排序 ID 是 ASC(即我插入的行在表中向下)但我们将仅使用表中的最新信息(即下面的行)。

如果我们将默认顺序更改为 DESC(即新记录到表的顶部)并且将从表的顶部查询频繁的信息,是否会有任何性能改进。

最佳答案

我认为恰恰相反。

我的评论基于我对索引在 SQL Server 中的工作方式的理解——如果我有机会阅读更多有关它们在 MySQL 中的工作方式的信息,我会在稍后尝试修改。

与以相反顺序插入行相比,以与索引排序相同的顺序插入行可能会有轻微的性能优势。

如果您以相同的顺序插入,并且要插入的下一行在排序顺序上始终大于现有行,那么您将始终在最后一页行数据中找到下一个可用的空位(如果存在)。

如果你做相反的事情,总是让你的下一个插入行的排序顺序低于现有行,那么你的第一页行数据可能总是会发生冲突,引擎会做更多的工作来移动如果页面有空间,行的位置。

至于您在 select 语句中的 order by 子句: 1) SQL 标准中没有关于索引的任何内容,除了 ORDER BY 子句之外,没有任何内容可以保证您的结果集排序。通常 SQL Server 中仅使用一个索引的查询将看到按索引顺序返回的结果。但是,如果隔离级别更改为“读取未提交”(困惑?),那么它将更有可能按照它在内存或磁盘中找到它们的顺序返回行,这不一定是您想要的顺序。

2) 如果您的 select 语句中的 order by 基于与索引完全相同的列标准,那么您的数据库服务器应该按照索引顺序或与索引顺序相反的顺序执行相同的操作。这非常简单,除非您有一个多列索引,其中针对不同列混合了 ASC-DESC 声明。在 order by equal to index order 和 order by equal to inverse index order 的情况下,你可以获得相同的性能,其中反向索引顺序是通过在索引声明中用 DESC 和 ASC 替换 ASC 和 DESC 声明(显式和隐式)来确定的order by 子句。

关于mysql - 性能 - MySQL 在插入记录时的默认排序顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13547934/

相关文章:

mysql - mysql 表中具有最大值的 activerecord ruby​​ 行

php - MySQL - 如何根据另一个表中的列进行排序

database - 如何在数据库中存储堆栈或长数组?

mysql - 大型数据集的数据库选择

mysql - Rails 可以在没有索引的情况下处理数据库唯一性吗?

php - 为什么我的更新查询创建新行?

java - 如何从 JTable 获取值并添加到数据库。 Jtable 和 db 列不同

php - 用一个字符串搜索多个表字段,分开(MySQL)

java - 没有为 LoginRequest 调用 responseListener (Android) (Java) (php)

mysql - 在 SQL 上索引奇怪的通配符