【问题标题】:MySQL: Composite Primary Key, Unique and simple indexes for relational tableMySQL:关系表的复合主键、唯一和简单索引
【发布时间】:2015-12-12 19:41:41
【问题描述】:

我已经阅读了大量的答案,但还没有找到解释。我想知道如何正确设置特定表的索引。

我有一个连接其他两个表的关系表,其中还包含一些数据:

我想知道如何根据这点正确设置索引:

  • id 列是必需的(因为我使用的 Laravel 框架需要 id 主键)。

  • room_idchannel_iddate 需要唯一,因为 3 一起代表行。

  • room_idchannel_id 是外键。

  • date 列必须作为其公共搜索列进行索引。

我想出了这个,但我很确定它是多余且错误的:

  • 复合主键:idroom_idchannel_id
  • 复合唯一索引:room_idchannel_iddate
  • 索引:room_id
  • 索引:channel_id
  • 索引:date

附加问题:date 是否需要成为复合主键的一部分?

想知道正确设置主键、索引和唯一性的热点。

【问题讨论】:

    标签: mysql


    【解决方案1】:

    为了满足您的要求,我会这样做:

    • 主键:id
    • 索引:room_id
    • 索引:channel_id
    • 唯一索引:dateroom_idchannel_id

    解释:

    1. id 是自动递增的,所以PK就够了。
    2. room_idchannel_id 如果 id 排在第一位,在 PK 中将毫无用处。
    3. 每个索引都包含 PK。所以 PK 应该越小越好。
    4. 如果唯一索引以date 开头,您可以使用它进行日期搜索。因此不需要单独的date 索引。

    【讨论】:

    • 很有趣,所以第一个唯一值的行为与后面的不同?关于保持 PK 小,我可以将此作为一般经验法则吗?这意味着如果存在一个类似的关系表,其中存在 id PK,最好将外键仅作为索引保留?
    • 第一个问题请看Multiple-Column Indexes:“MySQL 可以使用多列索引来测试索引中所有列的查询,或者只测试第一个列的查询列,..”。对于第二个问题:不——我不会把它作为一般规则。但在您的情况和大多数情况下,定义了自动增量库,AI 列应该是 PK。不 - 没有必要仅仅因为它是一个 FK 就将一个 FK 放入 PK。
    猜你喜欢
    • 2014-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-06
    • 2020-02-02
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    相关资源
    最近更新 更多