我看到很多关于多个问题的独特约束的问题,但没有一个问题符合我的具体要求。如果这是一个副本,我道歉。
我有一张桌子就是: tableA_id tableB_id
我的主键是两个表上的唯一约束,并且我在两个列上都有一个索引。两者都是他们受尊敬的表的主键。
如果tableA可能有10,000,000行,而表B有2,000,000行,那么TableB更有可能在这个约束中的次数要少得多。这很难过,当我制作我的唯一约束以将TableB作为第一列时,它更加优化,因为搜索较少,TableA(如果是这样的话),或者它没有区别,因为它不会先搜索一个然后另一个,而是一个接一个地看着它们。
提前致谢
答案 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查询该表,则无需保留单列索引。