我正在阅读有关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)
列应按以下顺序排列:
pin_id
。一旦相等条件找到匹配行的子集,它们就都按照它们的顺序进行绑定,因为自然地,它们对于质量条件的列都具有相同的值(board_id
在这种情况下)。
关系由索引中下一列的顺序解决。如果(且仅当)下一列是该ORDER BY
子句中使用的列,则可以按索引顺序读取行,而无需进行进一步的排序工作。
我不知道您链接到的Pinterest博客帖子的解释是什么。我猜这是一个错误,因为索引对于他们显示的查询不是最佳的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句