我一直在阅读 Pinterest 如何在此处对他们的 MySQL 数据库进行分片。
他们在那篇文章中谈论的一件事是拥有“单向‘映射’”表,例如
CREATE TABLE board_has_pins (
board_id INT,
pin_id INT,
sequence INT,
INDEX(board_id, pin_id, sequence)
) ENGINE=InnoDB;
然后是相反的pin_owned_by_board
。
我的问题是,为什么你会有这些用于“映射”的“单向表”,而不仅仅是一个具有不同索引结构的表?我不认为它可以停止重复,因为序列是一个 unix 时间戳,但索引确实限制了只能通过board_id
这个实例或完整索引(无论如何有效)进行选择。那么为什么不在board_id
和上有单独的索引pin_id
呢?这是不是因为一个 pin 理论上可以存在于一个单独的碎片上,即使他们试图将它们保持在同一个碎片上,所以让它成为“单向”是有意义的?
我同意这是一张奇怪的桌子。
没有唯一性约束,因此可能会出现重复。我会
INDEX
改成PRIMARY KEY
.没有相反方向的索引,所以不太可能那样使用它。我会添加另一列
INDEX(bin_id, board_id, pin_to_board sequence)
另一方面,也许表中有很多活动——例如频繁更新所有序列值。不过,InnoDB 确实更喜欢有一个
PRIMARY KEY
,并且那个三元组似乎是“正确的”PK。我可能会更加努力地避免潜在的时间戳重复。