首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当查询“期望检索表中行的2-4%”时,我们为什么要使用SQL索引?

当查询“期望检索表中行的2-4%”时,我们为什么要使用SQL索引?
EN

Stack Overflow用户
提问于 2014-03-19 02:26:56
回答 2查看 109关注 0票数 2

我正在研究一些SQL,关于查询,它说:

当表很大时创建一个索引,并且大多数查询将检索不到表中行的2%至4%。

我只想从心理上了解这句话的意思。我理解这个索引是为了使您的查询更快。是因为指数只会集中在2%到4%的表格上吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-03-19 02:37:19

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

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

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

SQL有两种满足这样一个where子句的方法。它可以读取每一行,并将每一行中的值与条件进行比较。这被称为“全表扫描”。它只需在索引中查找适当的值。这被称为“索引扫描”。

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

然而,这种启发式方法存在一个问题。索引用于其他目的:

  • 如果索引与order by子句匹配(以及查询中的其他条件为真),则可以使用索引按顺序检索记录。
  • 索引可用于连接记录。
  • 如果索引中的列是查询中的唯一列(在本例中,索引“覆盖”查询),则可以使用索引来满足整个查询。

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

票数 2
EN

Stack Overflow用户

发布于 2014-03-19 02:30:06

不,如果索引位于where条件下的列上,则不必进行表扫描。如果返回一小部分行,则不执行表扫描是有益的。

如果您返回100%的行,则表扫描和索引扫描之间没有重大差别。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22495037

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档