假设我想将用户提供的数据存储在名为的表中post
。
user_id
用户数据按列隔离select sum(likes_count) where user_id = $
应该很快select * from post where id = $
应该很快
您能否帮助从性能、索引和典型用例的角度比较一下这些模式?
注意:char(24) 值是 MongoDB 的 ObjectId 十六进制字符串。它们在整个数据库中是唯一的。
方案一:
使用PRIMARY KEY (id)
和二级索引(user_id)
CREATE TABLE posts_v1 (
id CHAR(24) NOT NULL,
user_id CHAR(24) NOT NULL,
likes_count INT,
PRIMARY KEY (id),
KEY 'user_id_idx' (user_id)
);
使用PRIMARY KEY (user_id, id)
和辅助唯一索引(id)
方案 2:
CREATE TABLE posts_v2 (
id CHAR(24) NOT NULL,
user_id CHAR(24) NOT NULL,
likes_count INT,
PRIMARY KEY (user_id, id),
UNIQUE KEY 'id_idx' (id)
);
问题:
1- 在哪些情况下,一种模式的性能会优于另一种模式?例如,按 user_id、id 或两者过滤的查询。
2-posts_v2
使用 进行查询时,架构是否使用较少的 InnoDB 页面读取user_id
?我假设在 的情况下posts_v2
,表在物理上按 分组user_id
,因此我们可以用较少的页面扫描检索所有用户帖子,我的假设正确吗?
3- 数据完整性和维护:这两种设计对数据完整性、维护或未来模式演变是否有任何影响?
4- 用例:哪些典型的用例或工作负载可能有利于一种设计而不是另一种设计?
我感谢您提供的任何见解或建议!