我有一个表的b树索引在column A上(非唯一),现在我想在插入时增加一个column A和column B组合的唯一性检查,所以我想增加一个唯一的复合索引(A, B),我应该删除现有的非复合索引吗?(正如我所读到的,大多数情况下查询使用单索引)对于仅在column A上的查询,唯一复合索引是否与非唯一非复合索引一样有效?
column A
column B
(A, B)
0dxa2lsx1#
如果在where子句中有许多查询只针对列A,那么除了新的索引之外,您很可能还应该保留列A上的索引。使用索引的查询数量和查询成本差异是决定是否离开索引的两个最重要的标准。正如Frank Heikens评论所说,由于它取决于许多因素,如表中的内容数量和查询参数,因此您可以使用EXPLAIN ANALYZE语句来检查使用或不使用索引的重要查询,以确认您的假设。
cfh9epnr2#
保留两个索引的可能性很小。如果几乎从不使用唯一索引(因为您从不执行插入或非HOT更新,或从两列中受益的查询),并且您拥有恰好合适的内存量和内存使用模式,则单列索引可能足够小,可以保留在高速缓存中,而复合索引则不会。但最有可能发生的情况是,复合索引至少会在两个索引争夺缓存空间的足够长的时间内被使用,从而使其总体效率降低。
2条答案
按热度按时间0dxa2lsx1#
如果在where子句中有许多查询只针对列A,那么除了新的索引之外,您很可能还应该保留列A上的索引。
使用索引的查询数量和查询成本差异是决定是否离开索引的两个最重要的标准。正如Frank Heikens评论所说,由于它取决于许多因素,如表中的内容数量和查询参数,因此您可以使用EXPLAIN ANALYZE语句来检查使用或不使用索引的重要查询,以确认您的假设。
cfh9epnr2#
保留两个索引的可能性很小。如果几乎从不使用唯一索引(因为您从不执行插入或非HOT更新,或从两列中受益的查询),并且您拥有恰好合适的内存量和内存使用模式,则单列索引可能足够小,可以保留在高速缓存中,而复合索引则不会。
但最有可能发生的情况是,复合索引至少会在两个索引争夺缓存空间的足够长的时间内被使用,从而使其总体效率降低。