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