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

时间:2011-12-14 20:33:08

标签: mysql unique-constraint unique-index

我看到很多关于多个问题的独特约束的问题,但没有一个问题符合我的具体要求。如果这是一个副本,我道歉。

我有一张桌子就是: tableA_id tableB_id

我的主键是两个表上的唯一约束,并且我在两个列上都有一个索引。两者都是他们受尊敬的表的主键。

如果tableA可能有10,000,000行,而表B有2,000,000行,那么TableB更有可能在这个约束中的次数要少得多。这很难过,当我制作我的唯一约束以将TableB作为第一列时,它更加优化,因为搜索较少,TableA(如果是这样的话),或者它没有区别,因为它不会先搜索一个然后另一个,而是一个接一个地看着它们。

提前致谢

2 个答案:

答案 0 :(得分:2)

通常建议在复合索引的左侧放置一个具有更多不同值的列。这会产生更具选择性的指数,这对于找到特定的值更有利。

报价表MySQL docs

  

消除行的考虑。如果之间有选择   多个索引,MySQL通常使用找到的索引   最小行数(最具选择性的索引)

但我的印象是,您似乎正在尝试优化对表的插入失败。如果你对表的写入多于读取,并且大多数写入都是重复的,那么你可能是对的。但即使在后一种情况下,MySql也需要检查其他列的唯一性。因此,最好先放一个具有更多不同值的列。

答案 1 :(得分:0)

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

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

在这种情况下,tableA_id上的单列索引不是必需的,因为任何可以使用该索引的语句也可以使用主键中的索引。因此,您至少可以删除tableA_id上的单列索引。

我认为MySQL的优化器不够智能,不能将PK索引用于包含WHERE tableB_id = 42的语句。

因此,您可能希望在该列上保留单列索引如果您将该ID用作语句中的单个条件。

如果您始终使用两个ID查询该表,则无需保留单列索引。