gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 08:24:21 37 4
gpt4 key购买 nike

我正在阅读一篇关于 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/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com