澄清为什么我们应该在查询"expected to retrieve less 2 - 4% of rows in the table"时使用SQL索引?



我正在学习一些SQL,关于查询它说:

在表比较大且需要查询的情况下创建索引检索不到表中2%到4%的行。

我只是想在脑海中勾勒出这句话的意思。我知道索引是为了让你的查询更快。是因为指数只关注表的2%到4%吗?

数据库以页、数据页存储数据。提高查询效率的一种方法是减少需要读取的数据页的数量。

一个典型的数据库页面的大小可能是8k - 64k。如果记录非常大,则每页可能只有一条记录。如果记录非常小,则每页可能有数百甚至数千条记录。

当您在where子句中的列上有索引和条件时,这限制了行数。这个比例被称为where条款的"选择性"。

SQL引擎有两种方式来满足这样的where子句。它可以读取每一行,并将每行中的值与条件进行比较。这被称为"全表扫描"。它可以在索引中查找相应的值。这被称为"索引扫描"。

现在,当为where子句使用索引时,我们想要做的是减少被读取的数据页的数量。当我们平均每页阅读不到一条记录时,就会发生这种情况。这就是2% - 4%的来源。请注意,如果您有非常大的记录,则该数字可能会大得多。

然而,这个启发式有一个问题。索引用于其他目的:

  • 如果索引匹配order by子句(以及查询中的其他条件为真),则可以使用索引按顺序检索记录。
  • 索引可用于连接记录。
  • 如果索引中的列是查询中唯一的列(在这种情况下,人们说索引"覆盖"了查询),则索引可以用于满足查询的全部。

所以,你读到的信息是启发式的。这是一个有用的指导方针,但它绝对不是一成不变的。

不,如果索引在where条件中的列上,则不必进行表扫描。如果返回的行较少,则不进行表扫描是有益的。

如果您返回100%的行,那么表扫描和索引扫描之间没有太大的区别。

相关内容

最新更新