3

我看到大量关于多个问题的独特约束的问题,但没有一个与我特别寻找的内容相匹配。如果这是一个副本,我很抱歉。

我有一个表就是:tableA_id tableB_id

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

如果 tableA 可能有 10,000,000 行,而 table B 可能有 2,000,000 行,则 TableB 更有可能处于此约束中的次数要少得多。可悲的是,当我将我的唯一约束设置为将 TableB 作为第一列时是否更优化,因为要搜索的内容更少,TableA(如果是这样,为什么),或者它没有任何区别,因为它没有先搜索一个另一个,而是一个一个地看着两者。

提前致谢

4

2 回答 2

3

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

MySQL 文档的报价单:

从考虑中消除行。如果在多个索引之间进行选择,MySQL 通常会使用找到最少行数的索引(最有选择性的索引)

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

于 2011-12-15T08:30:06.033 回答
0

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

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

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

我认为 MySQL 的优化器不够聪明,无法将 PK 索引用于包含WHERE tableB_id = 42.

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

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

于 2011-12-15T09:11:16.860 回答