外键列的聚簇索引
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.
考虑以下消息系统示例:
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.