Mysql 哪个性能更好?
在社交网络应用程序的上下文中,我正在考虑post及其评论的数据库模式,我想知道这两种模式中哪一种会提供更好的性能: 我在“评论”表中存储帖子的评论,在“帖子”表中存储帖子。 现在,comments表的模式如下所示: posted commentId postedBy Date CommentBody 因为为了检索帖子的评论,我需要搜索所有帖子的postId与该特定帖子的postId匹配的帖子,甚至我的postId也不能成为主键,因为postId在该列中是非唯一的(因为单个帖子有多条评论),因此,我在考虑是否可以将postId和commentId合并成一个commentId(这成为主键),使用它也可以检索postId。我是这样想的: CommentId将被生成为postId*100+i(其中i是帖子上的第i条评论)Mysql 哪个性能更好?,mysql,database,database-design,rdbms,Mysql,Database,Database Design,Rdbms,在社交网络应用程序的上下文中,我正在考虑post及其评论的数据库模式,我想知道这两种模式中哪一种会提供更好的性能: 我在“评论”表中存储帖子的评论,在“帖子”表中存储帖子。 现在,comments表的模式如下所示: posted commentId postedBy Date CommentBody 因为为了检索帖子的评论,我需要搜索所有帖子的postId与该特定帖子的postId匹配的帖子,甚至我的postId也不能成为主键,因为postId在该列中是非唯一的(因为单个帖子有多条评论),因此,
因此,为了检索一篇文章的评论(比如postId=8452),我将搜索所有带有commentId的文章(这将是主键),介于845200和845299之间。。而不是用postId=8452搜索所有注释。。(当然,这将评论的最大数量限制为100)。但是这会带来性能提升吗?如果你想要获得大容量,你应该制作一个表帖子和一个表注释,以便有更小的表:)。不要忘了在它们上面使用索引和分区。如果你想要获得大容量,你应该制作一个表Post和一个表注释,以便有更小的表:)。不要忘记在它们上面使用索引和分区。如果
commodid
不是唯一的,您可以在(postId,CommentID)
上创建一个复合主键:
如果您的表是MyISAM
,您可以将commentId
标记为AUTO_INCREMENT
,这将为其分配一个每帖子唯一的
递增值
如果它是唯一的,您可以在CommentId
上创建主键
,并在(PostId,CommentId)
上创建辅助索引:
如果commodid
不是唯一的,则可以在(postId,CommentID)
上创建复合主键
:
如果您的表是MyISAM
,您可以将commentId
标记为AUTO_INCREMENT
,这将为其分配一个每帖子唯一的
递增值
如果它是唯一的,您可以在CommentId
上创建主键
,并在(PostId,CommentId)
上创建辅助索引:
使用复合键。或者,如果您使用的框架只允许使用单列键,则postId上的二级索引使用复合键。或者,如果您使用的框架只允许使用单列键,那么可以在postId上创建一个二级索引。加载一个具有代表性数据的数据库,其大小(例如)是您期望的两倍
然后运行查询,并针对两个版本的模式对其进行测试
然后,这是好的一点,每X
周使用新的最新数据重新测试一次,以确保情况没有改变
这就是DBA的意义所在。除非您的数据永远不会更改,否则数据库优化不是一个“一劳永逸”的操作。唯一可以确定的方法是在代表性条件下进行测试
其他一切都是猜测。受过教育的猜测,不要误会我,但我宁愿有一个确定性的答案,而不是任何人的猜测,特别是因为前者会适应变化
我最喜欢的优化咒语是“测量,不要猜测!”以下是你要做的。加载一个具有代表性数据的数据库,其大小(例如)是您期望的两倍
然后运行查询,并针对两个版本的模式对其进行测试
然后,这是好的一点,每X
周使用新的最新数据重新测试一次,以确保情况没有改变
这就是DBA的意义所在。除非您的数据永远不会更改,否则数据库优化不是一个“一劳永逸”的操作。唯一可以确定的方法是在代表性条件下进行测试
其他一切都是猜测。受过教育的猜测,不要误会我,但我宁愿有一个确定性的答案,而不是任何人的猜测,特别是因为前者会适应变化
我最喜欢的优化咒语是“衡量,不要猜测!”
CommentId将被生成为postId*100+i(其中i是帖子上的第i条评论)
因此,为了检索一篇文章的评论(比如postId=8452),我将搜索所有带有commentId的文章(这将是主键),介于845200和845299之间。。而不是用postId=8452搜索所有注释。。(当然,这将评论的最大数量限制为100条)。但这会带来任何性能提升吗
与基于postId外键列的查询相比,这可能会使性能大大降低,但唯一可以确保的方法是尝试这两种技术(如paxdiablo所建议的)并测量性能
CommentId将被生成为postId*100+i(其中i是帖子上的第i条评论)
因此,为了检索一篇文章的评论(比如postId=8452),我将搜索所有带有commentId的文章(这将是主键),介于845200和845299之间。。而不是用postId=8452搜索所有注释。。(当然,这将评论的最大数量限制为100条)。但这会带来任何性能提升吗
与基于postId外键列的查询相比,这可能会带来更差的性能,但唯一可以确保的方法是尝试这两种技术(如paxdiablo所建议的)并测量性能。我建议:
- 在comme中使用具有复合键的双表结构
CREATE TABLE Comment
(
postId INT NOT NULL,
commentId INT NOT NULL,
…,
PRIMARY KEY (postId, commentId)
)
CREATE TABLE Comment
(
commentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
postId INT NOT NULL,
…,
KEY (postId, commentId)
)