很抱歉这个简单的问题,但我问了几个人并得到了不同的答案。
我有一个由2列组成的联接表:(aID,bID)
aID是表A的外键,bID是表B的外键
aID和bID一起是连接表的主键。
以下哪一项是在连接表上创建索引的更有效方法?
答案 0 :(得分:3)
<强> TL; DR 强>
(aID, bID)
上的索引 - 由于它是主键,因此已添加唯一索引。bID
上的孤立查询在您的使用中很常见,则您可能希望bId
上有单独的索引,例如像WHERE bID = 123
aID
上考虑索引时可能会有轻微的优点(特别是如果bID
不是狭义类型)。但与所有索引一样,您需要知道如何编写和访问数据,以便优化所有数据库使用者的性能。
更多详情
我应该在(aID,bID)上创建一个唯一索引。
不,如果(aID, bID)
上已有主键,则Oracle已经有unique index,因此此处的其他索引将是多余的。
我应该为aID和bID创建单独的索引。
每个外键列(独立地)有general rule of thumb到add an index,但是,可能存在(非常)少数情况,这将是冗余或无效的,例如,你永远不会被外键过滤,或者外键没有选择性。
钻进每个人:
aID?
可能不是。因为主键是(aid, bid)
,所以已经有一个以aID
作为第一列的索引,虽然不像只有aid
的索引一样密集。
bID?
可能,是的。虽然是唯一索引的一部分,bID
是第二列,但如果您经常查询bID
被隔离使用(即在没有{{1的查询时),则唯一索引不会有用也存在)。但是如果它不是与aID
隔离使用,并且根据所有索引,如果bId
具有低选择性(例如,{{1只有2个不同的值),则不要索引aID
每个都有50%的分布)然后索引就没用了。
其他注意事项
索引需要深入了解您的数据库是如何被利用的 - 需要仔细考虑新指数,并且需要对现有指数进行冗余分析(它们是否被利用?是否有类似的指标就足够了?)和有效性(如何我对索引的查询要快得多吗?)。
此外,是否添加许多或少数索引的决定还取决于读取与写入的偏差 - 更多索引会增加写入的I / O和磁盘开销,但这可能不是问题,例如在每天重建一次的报告服务器上。