mysql - 如果在查询中使用 order by,如何对 MySQL 中的索引列进行排序?

标签 mysql indexing

我正在阅读一篇关于 Pinterest 如何对他们的 MySQL 数据库进行分片的文章:https://medium.com/@Pinterest_Engineering/sharding-pinterest-how-we-scaled-our-mysql-fleet-3f341e96ca6f

这里有一个表格示例:

CREATE TABLE board_has_pins (
  board_id INT,
  pin_id INT,
  sequence INT,
  INDEX(board_id, pin_id, sequence)
) ENGINE=InnoDB;

他们展示了如何从该表中查询:

SELECT pin_id FROM board_has_pins 
WHERE board_id=241294561224164665 ORDER BY sequence 
LIMIT 50 OFFSET 150

这里我不明白的是索引的顺序。如果索引是这样的,因为它们是按顺序排序并按 board_id 过滤的,这不是更有意义吗?

INDEX(board_id, sequence, pin_id)

我是不是遗漏了什么或者我误解了索引的工作原理?

最佳答案

你是对的。此查询的更好索引是:

INDEX(board_id, sequence, pin_id)

列应按以下顺序排列:

  • 参与相等比较的列。如果有多个列,它们的顺序无关紧要。
  • 列涉及 ORDER BY 子句,顺序与它们在 ORDER BY 中出现的顺序相同。
  • 其他用于获取值的列,例如 pin_id

一旦相等条件找到匹配行的子集,它们就其顺序而言都被绑定(bind),因为对于质量条件的列(board_id 在本例中,它们自然都具有相同的值例)。

平局由索引中下一列的顺序决定。如果(且仅当)下一列是 ORDER BY 子句中使用的列,则可以按索引顺序读取这些行,而无需进一步对它们进行排序。

我不知道您链接到的 Pinterest 博客文章的解释是什么。我猜这是一个错误,因为索引对于他们显示的查询不是最优的。

关于mysql - 如果在查询中使用 order by,如何对 MySQL 中的索引列进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47298285/

相关文章:

php - PHP 中的 undefined variable 错误

mysql - 将 2 周添加到日期 SQL

sql - 按规则创建自定义 SQL 顺序

mongodb - MongoDB 中的自定义索引比较器

Mysql select 不使用索引

php - 如何使 echo 成为 PHP 数组

mysql - 转移WordPress站点后出现问题

arrays - 索引第二个数组元素始终返回零

c# - 原始数组是否需要整数作为索引

php - 使用来自另一个数据库的选择查询更新 mysql 表