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)?
不是。两个单独的索引不一样是一个复合索引。尽管 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 KEYPK:由于您有查询,其中只有一列cid = X或pid = X这些行将彼此接近(r),因此 InnoDB 需要读取更少的页面。这可以显着加快多行结果查询。
缺点:
INSERT吞吐量将受到影响