[sql] 数据库索引如何工作?



Answers

我第一次读这篇文章对我非常有帮助。 谢谢。

从那时起,我对创建索引的缺点有了一些了解:如果使用一个索引写入表( UPDATEINSERT ),则实际上在文件系统中有两个写操作。 一个用于表格数据,另一个用于索引数据(以及对它的引用(和 - 如果聚集 - 表格数据的求和))。 如果表和索引位于同一块硬盘上,则花费更多时间。 因此,没有索引(堆)的表将允许更快的写入操作。 (如果你有两个索引,最终会有三个写操作,依此类推)

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

索引的另一个问题是插入数据时随时间的碎片。 REORGANIZE帮助,你必须编写例程来完成它。

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

例如: - 如果您有很多相对的写作,但只有一个晚上在工作时间以外进行报告。

而且,聚集索引和非聚集索引之间的区别也非常重要。

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

Question

鉴于indexing是如此重要,因为你的数据集的规模增加,有人可以解释如何索引工作在database-agnostic水平?

有关索引字段的查询的信息,请查看如何索引数据库列




现在,假设我们想运行查询来查找名为'Abc'的所有员工的所有详细信息?

SELECT * FROM Employee 
WHERE Employee_Name = 'Abc'

没有索引会发生什么?

数据库软件从字面上必须查看Employee表中的每一行,以查看该行的Employee_Name是否为'Abc'。 而且,因为我们希望每一行里面都有'Abc'这个名字,所以一旦我们找到一行名为'Abc'的行,我们就不能停止查找,因为可能有其他行的名称为Abc 。 因此,直到最后一行为止的每一行都必须被搜索 - 这意味着在这种情况下成千上万行将被数据库检查以查找名称为'Abc'的行。 这就是所谓的全表扫描

数据库索引如何提高性能

具有索引的全部要点是通过基本上减少需要检查的表中的记录/行数来加速搜索查询。 索引是一种数据结构(最常见的是B-树),用于存储表中特定列的值。

B树索引如何工作?

B树是索引中最流行的数据结构的原因是由于它们具有时间效率 - 因为查找,删除和插入都可以在对数时间内完成。 而且,B-树更常用的另一个主要原因是因为可以对存储在B-树内的数据进行排序。 RDBMS通常确定哪个数据结构实际用于索引。 但是,在某些使用某些RDBMS的场景中,实际上可以指定在创建索引时希望数据库使用哪种数据结构。

哈希表索引如何工作?

使用哈希索引的原因是因为散列表在查找值时非常高效。 因此,如果使用散列索引,那么与字符串进行比较的查询可以非常快速地检索值。

例如,我们前面讨论的查询可以从Employee_Name列上创建的哈希索引中受益。 散列索引的工作方式是列值将成为哈希表的键值,映射到该键值的实际值只是指向表中的行数据的指针。 由于散列表基本上是一个关联数组,因此典型的条目看起来像“Abc => 0x28939”,其中0x28939是对Abc存储在内存中的表行的引用。 在哈希表索引中查找像“Abc”这样的值并取回对内存中行的引用显然要比扫描表找到Employee_Name列中值为“Abc”的所有行快得多。

哈希索引的缺点

哈希表不是有序的数据结构,并且有许多类型的查询哪些哈希索引甚至无法帮助。 例如,假设你想找出所有40岁以下的员工。 你怎么能用哈希表索引来做到这一点? 那么,这是不可能的,因为散列表只适用于查找关键值对 - 这意味着查询检查是否相等

数据库索引究竟是什么? 因此,现在您知道数据库索引是在表中的列上创建的,并且索引将该值存储在该特定列中。 但是,理解数据库索引不会将值存储在同一表的其他列中很重要。 例如,如果我们在Employee_Name列上创建索引,这意味着Employee_Age和Employee_Address列值不会同时存储在索引中。 如果我们只是将所有其他列存储在索引中,那么就像创建整个表的另一个副本一样 - 这会占用太多空间并且效率非常低。

数据库如何知道何时使用索引? 当运行“SELECT * FROM Employee WHERE Employee_Name ='Abc'”这样的查询时,数据库将检查被查询的列是否存在索引。 假设Employee_Name列确实有索引创建,数据库必须决定使用索引来查找正在搜索的值是否有意义 - 因为在某些情况下,使用数据库索引实际上效率较低,并且更有效地扫描整个表格。

拥有数据库索引的成本是多少?

它占用空间 - 桌子越大,指数越大。 索引的另一个性能是,无论何时添加,删除或更新相应表中的行,都必须对索引执行相同的操作。 请记住,索引需要包含与索引覆盖的表列中的任何内容相同的分钟数据。

一般来说,如果索引列中的数据将经常被查询,则只应在表上创建索引。

也可以看看

  1. 哪些列通常能够创建好的索引?
  2. 数据库索引如何工作



简单描述!!!!!!!!!!

索引不过是一个数据结构,它将表中特定列的值存储起来。 索引是在表格的一列上创建的。

例如,我们有一个名为User的数据库表,其中包含三列 - 名称,年龄和地址。 假设用户表有成千上万行。

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

SELECT * FROM User 
WHERE Name = 'John'

数据库软件从字面上必须查看用户表中的每一行,以查看该行的名称是否为'John'。 这将需要很长时间。
这是索引可以帮助我们的地方“索引用于通过减少需要检查的表中记录/行的数量来加快搜索查询速度”。
如何创建索引

CREATE INDEX name_index
ON User (Name)

索引由一个表中的列值(例如:John)组成,并且这些值存储在数据结构中。
因此,现在数据库将使用索引来查找名为John的员工,因为该索引大概会按用户名称的字母顺序排序。 而且,因为它是排序的,这意味着搜索一个名字的速度要快很多,因为以“J”开头的所有名称都将在索引中紧挨着!




试想一下数据库索引作为一本书的索引。 如果你有一本关于狗的书,并且你想找到关于德语牧羊犬的信息,那么你当然可以浏览书中的所有页面,找到你正在寻找的东西,但这当然是耗时的,而不是很快速。 另一种选择是,您可以直接转到本书的索引部分,然后使用您正在查找的实体的名称(在本例中为德国牧羊犬)查找您要查找的内容,并查看页码快速找到你要找的东西。 在数据库中,页码被称为指针,它将数据库指向实体所在磁盘上的地址。 使用相同的德国牧羊犬的比喻,我们可以有这样的东西(“德国牧羊犬”,0x77129),其中0x77129是存储德国牧羊犬的行数据的磁盘上的地址。

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






Related