我正在阅读一篇关于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)
我在这里遗漏了什么,或者我误解了索引是如何工作的?
答案 0 :(得分:2)
你是对的。此查询的更好索引是:
INDEX(board_id, sequence, pin_id)
列应按此顺序排列:
pin_id
。一旦相等条件找到了匹配行的子集,它们都与它们的顺序相关联,因为它们对于质量条件的列自然都具有相同的值(在这种情况下为board_id
)。
根据索引中下一列的顺序解决关系。如果(且仅当)下一列是ORDER BY
子句中使用的列,则可以按索引顺序读取行,而无需进一步排序。
我不知道您链接到的Pinterest博客文章的解释是什么。我想这是一个错误,因为索引对于他们展示的查询并不是最佳的。