外键列的聚簇索引

Clustered index for foreign key column

考虑以下消息系统示例:

create table chat_group
(
    id           int auto_increment primary key,
    title        varchar(100)         not null,
    date_created date                 not null
)


create table chat_message
(
    id                int auto_increment,
    user_id           int                  not null,
    chat_group_id     int                  not null,
    message           text charset utf8mb4 not null,
    date_created      datetime             not null
)

现在我看到 chat_message table 最常见的请求是 SELECT * FROM chat_message where chat_group_id = ?。所以我的想法是在 chat_group_id 列上放置一个聚集索引,这样聊天消息将按组在磁盘上组织。

但是在MySQL中要求PRIMARY KEY(实际上是聚簇索引)是唯一的,那么这里有什么解决办法呢?针对给定的情况,我做什么样的聚簇索引。

是的,“你也可以吃你的蛋糕”:

PRIMARY KEY(chat_group_id, id),
INDEX(id)

PK提供按组“聚类”;这可能会加快您的主要查询。包含 id 使其具有唯一性,这是 PK 的要求(在 MySQL 中)。

辅助 INDEX(id) 是保持 AUTO_INCREMENT 快乐所需的最低限度——即具有 一些 索引 从 [=22 开始=] id.