我正在学习一些SQL,关于查询它说:
在表比较大且需要查询的情况下创建索引检索不到表中2%到4%的行。
我只是想在脑海中勾勒出这句话的意思。我知道索引是为了让你的查询更快。是因为指数只关注表的2%到4%吗?
数据库以页、数据页存储数据。提高查询效率的一种方法是减少需要读取的数据页的数量。
一个典型的数据库页面的大小可能是8k - 64k。如果记录非常大,则每页可能只有一条记录。如果记录非常小,则每页可能有数百甚至数千条记录。当您在where
子句中的列上有索引和条件时,这限制了行数。这个比例被称为where
条款的"选择性"。
SQL引擎有两种方式来满足这样的where
子句。它可以读取每一行,并将每行中的值与条件进行比较。这被称为"全表扫描"。它可以在索引中查找相应的值。这被称为"索引扫描"。
现在,当为where
子句使用索引时,我们想要做的是减少被读取的数据页的数量。当我们平均每页阅读不到一条记录时,就会发生这种情况。这就是2% - 4%的来源。请注意,如果您有非常大的记录,则该数字可能会大得多。
然而,这个启发式有一个问题。索引用于其他目的:
- 如果索引匹配
order by
子句(以及查询中的其他条件为真),则可以使用索引按顺序检索记录。 - 索引可用于连接记录。
- 如果索引中的列是查询中唯一的列(在这种情况下,人们说索引"覆盖"了查询),则索引可以用于满足查询的全部。
所以,你读到的信息是启发式的。这是一个有用的指导方针,但它绝对不是一成不变的。
不,如果索引在where条件中的列上,则不必进行表扫描。如果返回的行较少,则不进行表扫描是有益的。
如果您返回100%的行,那么表扫描和索引扫描之间没有太大的区别。