两个单独的索引是否等于一个复合索引?

Sat*_*ato 2 mysql innodb index

例如,这是一个示例表

id int PK,
pid int,
cid int,
deleted int,
createdAt timestamp,
UNIQUE KEY pid_cid(pid, cid)
Run Code Online (Sandbox Code Playgroud)

使用的 WHERE 子句是

where pid=$pid and cid=$cid [and deleted = 1];
where pid=$pid [and deleted = 1];
where cid=$pid [and deleted = 1];
Run Code Online (Sandbox Code Playgroud)

既然我已经索引了UNIQUE KEY pid_cid(pid, cid),我应该分别索引 pid 和 cid 吗?

还是选择 aindex pid比选择a快UNIQUE KEY pid_cid(pid, cid)

Kár*_*agy 5

不是。两个单独的索引不一样是一个复合索引。尽管 MySQL 现在具有除分析查询以外的索引合并功能,但效率并不高。

在您的情况下,最好拥有唯一键和单列索引。

以较高的基数列开始组合。如果pid有更多不同的值,那么它就是好的。如果cid比我建议使用的多UNIQUE KEY (cid, pid)。还要创建一个单独的索引,它只是唯一键中的第二列。

例如

UNIQUE KEY (cid, pid), KEY (pid) 或者 UNIQUE KEY (pid, cid), KEY (cid)

这边走:

  • where pid=$pid and cid=$cid [and deleted = 1] 将使用唯一键

其中一个将使用复合唯一键,另一个将使用单列索引。

  • where pid=$pid [and deleted = 1];
  • where cid=$pid [and deleted = 1];

 替代方案

您可以使复合索引PRIMARY KEY在另一列上具有单个键:

优点

  • 非常快速的查找 PRIMARY KEY
  • 无需额外身份证
  • 行自然会聚集在 的第一列周围PK

由于您有查询,其中只有一列cid = Xpid = X这些行将彼此接近(r),因此 InnoDB 需要读取更少的页面。这可以显着加快多行结果查询。

缺点

  • 每个索引都会将 PK 连接到它,因此如果您有很多二级索引,这可能会消耗一些空间。
  • 如果 pid 或 cid 都不是递增顺序,您的INSERT吞吐量将受到影响