何时使用索引
内置索引最适合具有许多包含索引值的行的表。在特定列中存在的唯一值越多,查询和维护索引所需的平均开销就越大。例如,假设您有一个包含十亿条自行车手在数百场比赛中的记录的比赛表,并且想要按自行车手查找排名。许多自行车手的排名将在比赛年份的列值中共享。race_year
列是索引的良好候选者。
如果需要辅助索引,基于除分区键以外的一个或多个表列,请使用存储附加索引 (SAI)。有关详细信息,请参阅 CREATE CUSTOM INDEX。
何时不使用索引
在以下情况下不要使用索引
-
对于大量记录的小量结果查询,不要在高基数列上使用索引。请参阅下面的 使用高基数列索引的问题。
-
在使用计数器列的表中。
-
不要在频繁更新或删除的列上使用索引。请参阅下面的 在频繁更新或删除的列上使用索引的问题。
-
不要使用索引查找大型分区中的行,除非查询范围很窄。请参阅下面的 使用索引查找大型分区中的行的问题,除非查询范围很窄。
-
不要在同一个表中添加辅助索引和搜索索引。
使用高基数列索引的问题
如果您在高基数列上创建索引,该列具有许多不同的值,那么字段之间的查询会产生许多查找,而结果却很少。在包含十亿首歌曲的表中,按作者(通常每首歌曲都是唯一的)而不是按其录制艺术家查找歌曲可能会非常低效。
手动维护表作为索引形式可能比使用内置索引更有效。对于包含唯一数据的列,有时为了性能,最好使用索引以方便起见,只要对具有索引列的表的查询量适中,并且不在持续负载下即可。
相反,在极低基数列(例如布尔列)上创建索引没有意义。索引中的每个值都会在索引中成为一行,例如,对于所有 false 值,会导致一个巨大的行。索引具有 foo = true 和 foo = false 的大量索引列没有用。