Mysql 什么';在这种情况下,自然关键点和合成关键点之间的关系更好

Mysql 什么';在这种情况下,自然关键点和合成关键点之间的关系更好,mysql,innodb,myisam,key,composite-primary-key,Mysql,Innodb,Myisam,Key,Composite Primary Key,我有一个表,它必须在mysql中存储数百万条帖子(在不久的将来)。这是简化的结构(我没有指出我的主键,因为我的问题是基于此): 我的问题是:定义密钥的最佳方式是什么 考虑到需要存储的记录数量,是否最好仅将我的自动增量ing'post\u id'用作主键和唯一键 我必须同时使用“post\u id”和“user\u id”作为复合键来用作主键和唯一键吗?如果这是最好的,我如何在其他表中将其用作外键?我是否只是将它们作为列添加到这些表中 请说明每种发动机的优点和缺点(如有),以及使用哪种发动机的一些

我有一个表,它必须在mysql中存储数百万条帖子(在不久的将来)。这是简化的结构(我没有指出我的主键,因为我的问题是基于此):

我的问题是:定义密钥的最佳方式是什么

  • 考虑到需要存储的记录数量,是否最好仅将我的
    自动增量
    ing'
    post\u id
    '用作主键和唯一键

  • 我必须同时使用“
    post\u id
    ”和“
    user\u id
    ”作为复合键来用作主键和唯一键吗?如果这是最好的,我如何在其他表中将其用作外键?我是否只是将它们作为列添加到这些表中


  • 请说明每种发动机的优点和缺点(如有),以及使用哪种发动机的一些建议。我认为如果我使用第二个选项,Innodb将是最好的。我不知道

    使用自动递增字段作为主键还是使用post_id和user_id的复合键,基本上可以归结为以下几点:

    如果您的
    posts
    表中有子表,您是否希望使用post的
    用户id
    查询这些表

    例如,如果允许其他用户对帖子发表评论,并且您有一个
    comments
    表,您是否看到希望从您查询原始帖子的
    用户id
    的comments表中获取数据的原因

    如果是这样,通过使用一个自动递增的字段,您必须始终加入父表(
    posts
    ),以便根据
    用户id
    )查询子表上的数据:

    SELECT comments.* 
    FROM comments
    INNER JOIN posts ON
        posts.post_id=comments.post_id
    WHERE posts.user_id='scott.korin'
    
    这可能会导致性能下降,尤其是当您希望
    posts
    表中有数百万行数据时


    如果您不需要使用
    user\u id
    字段查询子表,那么我将使用自动递增的
    post\u id
    。只需确保定义的字段足够大即可。(如果除了数百万条记录外,您不想因为post_id字段太小而被最多数百万条记录所困扰)。

    无论是将自动递增字段用作主键还是使用post_id和user_id的复合键,基本上都可以归结为以下几点:

    如果您的
    posts
    表中有子表,您是否希望使用post的
    用户id
    查询这些表

    例如,如果允许其他用户对帖子发表评论,并且您有一个
    comments
    表,您是否看到希望从您查询原始帖子的
    用户id
    的comments表中获取数据的原因

    如果是这样,通过使用一个自动递增的字段,您必须始终加入父表(
    posts
    ),以便根据
    用户id
    )查询子表上的数据:

    SELECT comments.* 
    FROM comments
    INNER JOIN posts ON
        posts.post_id=comments.post_id
    WHERE posts.user_id='scott.korin'
    
    这可能会导致性能下降,尤其是当您希望
    posts
    表中有数百万行数据时


    如果您不需要使用
    user\u id
    字段查询子表,那么我将使用自动递增的
    post\u id
    。只需确保定义的字段足够大即可。(如果除数百万条记录外,您不想因为post_id字段太小而被最多数百万条记录所困扰)。

    可能的重复。从理论上讲,与单列索引相比,访问多列索引的性能不会受到显著影响,如果所有列都很容易散列(例如整数),您可能会找到我感兴趣的先前答案,谢谢f00。这是一个精彩的回答,它解决了我的问题+1从我这里:-)可能的重复同样,从理论上讲,如果所有列都很容易散列(例如整数),那么访问多列索引与访问单列索引相比,不应该有显著的性能损失。您可能会找到我之前感兴趣的答案谢谢f00。这是一个精彩的回答,它解决了我的问题+我的一句话:-)谢谢。这真的很有帮助。还有一个问题:自动增量主键可靠吗?他们有什么我可能不知道的问题吗?我不打算使用
    user\u id
    检索评论。我只是举个例子,我找不到任何其他领域可以使用。很抱歉。据我所知,它们非常可靠,但我更熟悉它们在Microsoft SQL Server中的使用:)谢谢。这真的很有帮助。还有一个问题:自动增量主键可靠吗?他们有什么我可能不知道的问题吗?我不打算使用
    user\u id
    检索评论。我只是举个例子,我找不到任何其他领域可以使用。很抱歉。据我所知,它们非常可靠,但我更熟悉它们在Microsoft SQL Server中的使用:)