鉴于随着数据集大小的增加,索引变得如此重要,有人能解释一下索引是如何在数据库不可知的级别上工作的吗?

有关对字段进行索引的查询的信息,请查看How do I index a database column。


当前回答

经典示例“图书索引”

考虑一本1000页的“书”,分为10章,每节100页。

简单,嗯?

现在,假设你想找到一个包含“炼金术士”一词的特定章节。如果没有索引页,除了扫描整本书/章节,你别无选择。即:1000页。

这种类比在数据库世界中被称为“全表扫描”。

但是有了索引页,你就知道该去哪里了!此外,要查找任何重要的特定章节,您只需反复查看索引页即可。找到匹配的索引后,可以跳过其余部分,高效地跳转到该章节。

但是,除了实际的1000页之外,您还需要大约10页来显示索引,因此总共需要1010页。

因此,索引是一个单独的部分,存储索引的值列+按排序顺序指向索引行的指针,以提高效率查找。

学校里的事情很简单,不是吗P

其他回答

简单描述!

索引只是一个数据结构,它存储表中特定列的值。在表的列上创建索引。

示例:我们有一个名为User的数据库表,其中有三列:Name、Age和Address。假设User表有数千行。

现在,假设我们想运行一个查询来查找任何名为“John”的用户的所有详细信息。如果我们运行以下查询:

SELECT * FROM User 
WHERE Name = 'John'

数据库软件实际上必须查看User表中的每一行,以查看该行的名称是否为“John”。这需要很长时间。

这就是索引帮助我们的地方:索引用于通过实质上减少表中需要检查的记录/行的数量来加快搜索查询。

如何创建索引:

CREATE INDEX name_index
ON User (Name)

索引由一个表中的列值(例如:John)组成,这些值存储在数据结构中。

所以现在数据库将使用索引查找名为John的员工因为索引将按用户名。而且,因为它是排序的,所以它意味着搜索名称因为所有以“J”开头的名字都是正确的在索引中彼此相邻!

只需将数据库索引视为一本书的索引即可。

如果你有一本关于狗的书,你想找到关于德国牧羊犬的信息,你当然可以翻遍这本书的所有页面,找到你想要的东西——但这当然很耗时,而且速度也不快。

另一种选择是,你可以直接进入书中的索引部分,然后通过使用你要查找的实体的名称(在本例中为德国牧羊犬)并查看页码来快速查找你要查找什么。

在数据库中,页码被称为指针,它将数据库指向实体所在磁盘上的地址。使用同样的德国牧羊犬类比,我们可以得到类似的结果(“德国牧羊犬”,0x77129),其中0x77129是存储德国牧羊犬行数据的磁盘上的地址。

简而言之,索引是一种数据结构,它存储表中特定列的值,以加快查询搜索速度。

索引只是一种数据结构,它可以更快地搜索数据库中的特定列。该结构通常是b树或哈希表,但也可以是任何其他逻辑结构。

经典示例“图书索引”

考虑一本1000页的“书”,分为10章,每节100页。

简单,嗯?

现在,假设你想找到一个包含“炼金术士”一词的特定章节。如果没有索引页,除了扫描整本书/章节,你别无选择。即:1000页。

这种类比在数据库世界中被称为“全表扫描”。

但是有了索引页,你就知道该去哪里了!此外,要查找任何重要的特定章节,您只需反复查看索引页即可。找到匹配的索引后,可以跳过其余部分,高效地跳转到该章节。

但是,除了实际的1000页之外,您还需要大约10页来显示索引,因此总共需要1010页。

因此,索引是一个单独的部分,存储索引的值列+按排序顺序指向索引行的指针,以提高效率查找。

学校里的事情很简单,不是吗P

我第一次读到这篇文章时,它对我很有帮助。谢谢。

从那以后,我对创建索引的缺点有了一些见解:如果用一个索引写入表(UPDATE或INSERT),那么文件系统中实际上有两个写入操作。一个用于表数据,另一个用于索引数据(以及它的重新排序(如果是集群的话,还包括表数据的重新排序))。如果表和索引位于同一硬盘上,这将花费更多的时间。因此,没有索引的表(堆)将允许更快的写入操作。(如果您有两个索引,那么最终将有三个写操作,依此类推)

然而,在两个不同的硬盘上为索引数据和表数据定义两个不同位置可以减少/消除时间成本增加的问题。这需要根据所需硬盘上的文件定义其他文件组,并根据需要定义表/索引位置。

索引的另一个问题是,在插入数据时,索引会随着时间的推移而碎片化。重新组织有帮助,您必须编写例程才能完成。

在某些情况下,堆比具有索引的表更有用,

例如:-如果你有很多竞争性的写作,但只有一个晚上在工作时间外阅读报告。

此外,区分聚集索引和非聚集索引非常重要。

帮助我:-聚集索引和非聚集索引实际上是什么意思?