Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 哪个性能更好?_Mysql_Database_Database Design_Rdbms - Fatal编程技术网

Mysql 哪个性能更好?

Mysql 哪个性能更好?,mysql,database,database-design,rdbms,Mysql,Database,Database Design,Rdbms,在社交网络应用程序的上下文中,我正在考虑post及其评论的数据库模式,我想知道这两种模式中哪一种会提供更好的性能: 我在“评论”表中存储帖子的评论,在“帖子”表中存储帖子。 现在,comments表的模式如下所示: posted commentId postedBy Date CommentBody 因为为了检索帖子的评论,我需要搜索所有帖子的postId与该特定帖子的postId匹配的帖子,甚至我的postId也不能成为主键,因为postId在该列中是非唯一的(因为单个帖子有多条评论),因此,

在社交网络应用程序的上下文中,我正在考虑post及其评论的数据库模式,我想知道这两种模式中哪一种会提供更好的性能:

我在“评论”表中存储帖子的评论,在“帖子”表中存储帖子。 现在,comments表的模式如下所示:

posted commentId postedBy Date CommentBody

因为为了检索帖子的评论,我需要搜索所有帖子的postId与该特定帖子的postId匹配的帖子,甚至我的postId也不能成为主键,因为postId在该列中是非唯一的(因为单个帖子有多条评论),因此,我在考虑是否可以将postId和commentId合并成一个commentId(这成为主键),使用它也可以检索postId。我是这样想的:

CommentId将被生成为postId*100+i(其中i是帖子上的第i条评论)


因此,为了检索一篇文章的评论(比如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)
            )