SQL中的表扫描和索引扫描

Man*_*thi 7 sql database-table

SQL中的表扫描和索引扫描之间的区别是什么?具体使用它在哪里?

dan*_*era 13

表扫描意味着遍历所有表行.

索引扫描意味着迭代所有索引项,当项索引满足搜索条件时,通过索引检索表行.

Usualy索引扫描比表扫描便宜,因为索引比表更平坦.

关于这个问题,他们很多都是书目.样品:

索引访问是一种访问方法,SQL Server使用现有索引来读取和写入数据页.由于索引访问显着减少了I/O读取操作的数量,因此它通常优于表扫描.

在此方法中,通过遍历索引来检索行,使用语句指定的索引列值.索引扫描根据索引中一列或多列的值从索引中检索数据.要执行索引扫描,Oracle会在索引中搜索语句访问的索引列值.如果语句仅访问索引的列,则Oracle直接从索引读取索引列值,而不是从表中读取.


Oli*_*bes 12

大多数查询引擎都有一个查询优化器,它试图生成一个有效的查询执行策略.如果索引可用,这可以使查询更快,那么查询优化器将执行索引扫描或索引搜索,否则执行表扫描.

例:

SELECT * FROM tbl WHERE category_id = 5;
Run Code Online (Sandbox Code Playgroud)

如果category_id上没有索引,则将执行表扫描,即将检查表中的每个单个记录以查找正确的category_id.

但是,如果将category_id编入索引,则事情会变得更加复杂.如果表格非常大,则可能会选择索引搜索.但是,如果表很小,那么优化器可能会认为表扫描仍然更快,因为访问索引需要一些开销.如果category_id不够有选择性,例如,如果只有两个类别,那么即使对于大表,扫描表也可能更快.

索引通常被组织为树结构.在树中查找项目是O(log n)操作.表扫描是O(n)操作.速度主要取决于执行查询所需的磁盘访问次数.首先查找索引然后访问查找条目的表可以为小表生成更多磁盘访问.

我们来看看另一个查询:

SELECT category_id FROM tbl WHERE category_id BETWEEN 10 AND 100;
Run Code Online (Sandbox Code Playgroud)

这里还有另一种选择.在这种情况下,索引搜索可能不会比表扫描更快,但是,因为我们只检索catergory_id,所以索引扫描(而不是索引搜索)可能更快.索引扫描读取索引表的每个条目,而不是利用树结构(索引查找的内容).但是,由于请求的信息完全包含在索引中,因此不需要访问数据表.索引扫描就像表扫描O(n)操作一样,但由于索引通常小于表,因此扫描索引所需的磁盘访问量少于扫描表所需的磁盘访问量.

整个问题非常复杂,很大程度上取决于数据库引擎.如果您想了解更多信息,请阅读db供应商提供的文档.