MySQL:多列唯一约束的性能优化

3

我看到很多关于多个列上唯一性约束的问题,但没有符合我具体需求的。如果这是重复的问题,我很抱歉。

我有一个表格只包含:

tableA_id

tableB_id

我的主键是两张表格的唯一约束,并且对两列都建了索引。它们也分别是它们所属表格的主键。

如果tableA表格可能有10,000,000行,而tableB表格可能只有2,000,000行,则在这个约束中,TableB会更少地出现。那么,在制作唯一约束时,将TableB作为第一列是否更优化,因为需要搜索的表格较少?(如果是的话,为什么?)或者没有区别,因为它不是首先搜索其中之一,然后再搜索另一个,而是依次检查两者。

事先感谢!


你是不是指的是“两个列上的唯一约束”,而不是“两个表上的唯一约束”? - user330315
2个回答

3
通常建议在复合索引中将具有更多不同值的列放在左侧。这会产生一个更具选择性的索引,更适合查找特定的值。
引用自MySQL文档的一句话:
为了排除不需要考虑的行。如果有多个索引可供选择,MySQL通常使用能够找到最少行数的索引(最具选择性的索引)。
但我有一种印象,你似乎正在尝试优化向表插入失败的情况。如果您对表进行的写入操作比读取操作多,并且大多数写入操作都是重复的,则您可能是正确的。但即使在后一种情况下,MySql仍需要检查其他列的唯一性。因此,最好还是先放置具有更多不同值的列。

0

根据您的描述,我假设您拥有以下内容:

UNIQUE (tableA_id, tableB_id)
INDEX (tableA_id)
INDEX (tableB_id

在这种情况下,对于tableA_id的单列索引是不必要的,因为任何可以使用该索引的语句也可以使用主键的索引。所以您至少可以删除tableA_id上的单列索引。
我认为MySQL的优化器并不聪明到足够能够使用主键索引来执行包含WHERE tableB_id = 42语句。
所以如果您在语句中仅使用该ID作为单个条件时,可能要保留该列的单列索引。
如果您始终使用这两个ID查询该表,则无需保留单列索引。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接