两个看似相同的数据库如何返回按不同列排序的结果?

克里斯托弗·沃

我有一个查询

SELECT r.id
     , r.account_id
     , r.name
     , r.bucket_id
     , r.description
     , r.development
     , r.created_at
     , r.priority
  FROM realms r
 WHERE r.account_id = 3;

我在具有相同索引的两个不同表上运行它,一个结果按r.id排序r.created_at(无论哪种方式都相同),另一个结果按r.name. 怎么会这样?

通过 MySQL Workbench 中的表检查器查看它,两者的索引是:

+---------------------------+-------+-----+-----------------+
| key                       |Type   |Uni  | Columns         |
+ --------------------------+-------+-----+-----------------+
| PRIMARY                   | BTREE | YES | id              |
| realms_account_id_name_UQ | BTREE | YES | account_id,name |
| realms_account_id_IX      | BTREE | NO  | account_id      |
| realms_bucket_id_IX       | BTREE | NO  | bucket_id       |
+---------------------------+-------+-----+-----------------+

我认为是索引决定了行的顺序,当我在两者之间切换时,屏幕甚至不闪烁如果它们的主键是id为什么一个显示按名称排序的结果?

里克·詹姆斯

如果您的 中没有ORDER BY子句SELECT,系统可以随心所欲。时期。句号。

现在,我将解释可能发生的事情。

首先,优化器会分析索引、数据类型、统计信息等,并决定如何执行查询。您可以通过执行 了解此操作EXPLAIN SELECT ...它会说明它可能使用哪个索引。

我看到两个合理的索引 - 两个以account_id. 任何一个都可以。可能优化器在两台机器上的统计数据略有不同,导致它在一台机器上选择一个索引,而在另一台机器上选择另一个。

使用分析INDEX(account_id, name)该索引是 account_ids 和名称对的有序列表。在使用该索引的机器上,它向下钻取 BTree 索引到 的第一个条目account_id = 3,然后向前扫描。这为您提供了由 排序的结果name

使用分析INDEX(account_id)InnoDB,为了找到数据,将PRIMARY KEY附加到每个二级索引上。因此,该索引是有效的INDEX(account_id, id)在使用该索引的机器上,它向下钻取 BTree 索引到 的第一个条目account_id = 3,然后向前扫描。这为您提供了由 排序的结果id

第三种可能性很常见,值得注意。如果有很多行带有account_id = 3,优化器将决定避开索引并简单地读取数据。由于数据是根据 存储的PRIMARY KEY,它会再次按id顺序传递行(但出于完全不同的原因)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Nodejs Mongoose-一个数据库调用=两个不同的数组,按不同的标准排序

为什么两个看似相同的变量会产生两个不同的结果?

SQL如何按包含相同数据的两个不同列进行分组

在两个数据库的两个不同表中插入相同的Guid键

如何使用LINQ从数据库返回两个特定的列?

将看似相同的数组写入两个图像文件会导致不同的结果

Mysql PHP 查询。您如何将数据库中的两个不同列“排序”在一起?

如何避免两个不同的线程从数据库读取相同的行(Hibernate和Oracle 10g)

从两个不同的数据库中查找写入到两个相同表中的数据总数

MS Access-如何将来自两个不同数据库的两个直通查询合并为一个合并结果?

数据库查询选择两个表,按日期和限制排序

如何在同一列上基于两个不同条件编写按查询分组返回结果?

两个几乎相同的查询返回不同的结果

相同代码的两个版本返回不同的结果

两个看似相同的字符串表现不同

两个显示结果包含来自不同数据库的两个表之间的差异

Android,sqlite数据库在两列中找到两个值以及结果值

使用一个jQuery AJAX表单(或响应)返回两个数据库结果

联合两个表后如何在两个表中按具有相同列名的列排序?

如何合并来自两个不同数据库的不同表?

两个模型的数据库表相同

如何使用JDBC从两个不同的MySQL数据库中检索数据?

如何模拟两个相同的mongo集合,但结果不同?

对于两个不同的视图具有不同的数据库排序顺序(default_scope)

如何按两个不同的列对 Excel 工作表进行排序

使用sqlalchemy加入两个不同的数据库

如何以最佳方式从两个不同的数据库(如MySQL和Neo4j)删除相同的数据?

如何合并两个具有相同数据但具有不同PK且没有重复字段的数据库?

如何在 Firebase 实时数据库中合并两个查询的结果