索引需要多少才能缩小搜索结果的范围才能有用?

Nat*_*ong 4 index

索引需要多少来缩小搜索结果的范围才能有助于加快查询速度?

整个范围内的一些示例:

  • 用于存储真/假值的列显然只有两个唯一值。
  • “姓氏”列可能有许多唯一值(尽管可能没有)。
  • 主键列具有所有唯一值。

我认为索引的目标是快速将搜索范围缩小到几行,因此,最后一种情况最好,第二种情况可以,第一种情况无用。

我对么?如果是这样,大致有用的线在哪里?例如,如果一个索引可以将结果缩小到 1% 的行,那有用吗?10% 还是 25% 呢?

Lei*_*fel 6

列数据的多样性称为选择性。在确定索引是否有用时,选择性很有用,但它并不是决定速度优势的唯一因素。其他因素包括索引与表相比的存储速度、表/索引的缓存量、索引与表相比的大小以及其他一些因素。

知道列的数据类型并不一定能帮助我们确定列上索引的选择性。即使是限制为两个值的列也可能仅将这些值用于几行,而其余行为 NULL。另一方面,可以具有许多不同值的列在每一行中都可以具有相同的值。即使您的id列的所有行都具有唯一值,如果您正在搜索id>= 10 的行,即使索引具有高度选择性,它也可能没有用处。

您不能单独使用选择性来确定索引是否有用,因为即使它返回 100% 的行,如果索引包含查询所需的所有数据,它也会比使用表更快。另一方面,对于小表,即使正在查找的行仅占总数的 1%,查询整个内容可能会更快。

确定应该创建哪些索引与其说是查看表结构,不如说是查看重要的查询以及它们需要检索哪些数据。