什么是SQL中的索引?


Answers:


376

索引用于加速数据库中的搜索。MySQL在该主题上有一些不错的文档(也与其他SQL Server相关):http : //dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

索引可用于有效地查找与查询中某个列匹配的所有行,然后仅遍历表的该子集以查找完全匹配。如果WHERE子句中任何列上都没有索引,则SQL服务器必须遍历整个表并检查每一行是否匹配,这在大表上可能是一个缓慢的操作。

索引也可以是UNIQUE索引,这意味着在该列中不能有重复的值,或者PRIMARY KEY在某些存储引擎中定义值在数据库文件中的存储位置。

在MySQL中,您可以EXPLAINSELECT语句前面使用来查看查询是否将使用任何索引。这是解决性能问题的良好起点。在此处阅读更多信息:http : //dev.mysql.com/doc/refman/5.0/en/explain.html


“索引也可以是UNIQUE索引...”只是为了向您确认,这是否意味着索引可以是非UNIQUE?我一直认为它的独特性。我对SQL还是很
陌生

@DanielKurniadi大多数索引不是唯一的。我可能有一个用户数据库,想查询居住在哥德堡的每个人。在“城市”字段上的索引将加快我的查询。但是,哥德堡有1个以上的用户,因此索引必须是唯一的。
EmilVikström

174

聚集索引就像电话簿的内容一样。您可以在“ Hilditch,David”处打开这本书,并找到彼此相邻的所有“ Hilditch”信息。此处,聚集索引的键为(姓,名)。

这使聚簇索引非常适合基于基于范围的查询检索大量数据,因为所有数据都彼此相邻。

由于聚簇索引实际上与数据的存储方式有关,因此每个表只有一个可能(尽管您可以作弊以模拟多个聚簇索引)。

非聚集索引的不同之处在于,您可以拥有许多非聚集索引,然后它们指向聚集索引中的数据。例如,您可以在电话簿的背面有一个非聚集索引,该索引键入(城镇,地址)

想象一下,如果您必须在电话簿中搜索所有居住在“伦敦”的人-仅使用聚集索引,则由于聚集索引上的键已打开(姓氏,姓氏)​​,结果整个伦敦的居民散落在整个索引中。

如果您在(town)上具有非聚集索引,则可以更快地执行这些查询。

希望有帮助!


151

一个很好的类比是将数据库索引视为书中的索引。如果您有一本关于国家的书,并且正在寻找印度,那么为什么要翻阅整本书(相当于数据库术语中的全表扫描),而只需要转到书的背面本书,它将告诉您确切的页面,您可以在其中找到有关印度的信息。同样,书索引包含页码,数据库索引包含指向该行的指针,该行包含您要在SQL中搜索的值。

这里更多


2
我很佩服经验丰富的家伙通过使用“类比”来解释事情。+1
snr


49

索引都是关于快速查找数据的

数据库中的索引类似于您在书中找到的索引。如果一本书有索引,而我要求您在该书中找到一章,则可以借助索引快速找到它。另一方面,如果该书没有索引,则您将不得不花更多的时间查找该书开头到末尾的每一页,以查找该章节。

以类似的方式,数据库中的索引可以帮助查询快速找到数据。如果您不熟悉索引,那么以下视频可能会非常有用。实际上,我从他们那里学到了很多东西。

索引基础知识
聚集 索引和非聚集索引
唯一 索引和非唯一索引索引的
优缺点


阅读所有答案使我想知道为什么不索引所有内容。+1表示包含缺点的链接。
Lakshay Garg '18

@LakshayGarg有时不必要的索引编制也会降低查询的执行时间,因此我们不应该尝试对所有内容建立索引。就像一切都有优点和缺点一样。
加拉夫·拉杰德

@LakshayGarg Gaurav Rajdeo是正确的。太相似了:您可能希望索引书中的每个章节,图形或表格,但不索引每个段落,句子或单词。通常,这将是一个过大的杀伤力,并会导致不必要的并发症。希望它足够接近此答案中绘制的图片。
colidyre

23

好吧,一般指标是B-tree。索引有两种类型:聚集索引和非聚集索引。

聚集索引创建了物理的行顺序(它只能是一个,并且在大多数情况下也是主键-如果您在表上创建主键,则也会在该表上创建聚集索引)。

非聚集索引也是二叉树,但它不会创建行的物理顺序。因此,非聚集索引的叶节点包含PK(如果存在)或行索引。

索引用于提高搜索速度。因为复杂度是O(log N)。索引是一个很大且有趣的话题。我可以说有时在大型数据库上创建索引是一种技巧。


6
通常,它是b树而不是二叉树。
米奇·麦特

因此,因为索引使用自平衡树,所以每次添加/删除行时,索引都会自我平衡-使得插入/删除操作更加昂贵...对吗?
David Refaeli,

20

INDEXES -轻松查找数据

UNIQUE INDEX -不允许重复值

的语法 INDEX

CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);

的语法 UNIQUE INDEX

CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);

13

首先,我们需要了解正常查询(无索引)的运行方式。它基本上逐行遍历每一行,并在找到数据时返回。请参考下图。(此图像取自该视频。)

没有索引 因此,假设查询要查找50,它将必须读取49条记录作为线性搜索。

请参考下图。(此图像取自此视频

在此处输入图片说明

当我们应用索引编制时,查询将快速查找数据,而无需读取每个数据,而只需像遍历搜索那样消除每次遍历中的一半数据即可。mysql索引存储为B树,其中所有数据都在叶节点中。


12

INDEX是一项性能优化技术,可加快数据检索过程。它是与表(或视图)关联的持久性数据结构,目的是在从该表(或视图)检索数据时提高性能。

当您的查询包含WHERE过滤器时,将尤其应用基于索引的搜索。否则,即没有WHERE筛选器的查询将选择整个数据和过程。不使用INDEX搜索整个表称为表扫描。

您将以清晰可靠的方式找到Sql-Indexes的确切信息:请遵循以下链接:

  1. 要获得深入了解,请访问:http ://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Overview-and-Optimizations.html
  2. 对于实施方面的理解:http : //dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Creation-Deletetion-Optimizations.html

6

使用索引有几个不同的原因。主要原因是为了加快查询速度,以便您可以更快地获取行或对行进行排序。另一个原因是定义一个主键或唯一索引,这将确保没有其他列具有相同的值。


6

如果您使用的是SQL Server,最好的资源之一就是安装随附的自己的在线丛书!对于任何与SQL Server相关的主题,它都是第一位。

如果可行,“我应该怎么做?” 这类问题,那么StackOverflow将是一个更好的提问场所。

另外,我已经有一段时间没有回来了,但是sqlservercentral.com曾经是与SQL Server相关的顶级站点之一。


0

索引是on-disk structure associated with a table or view that speeds retrieval of rows from the table or view。索引包含从表或视图中的一个或多个列构建的键。这些键存储在结构(B树)中,该结构使SQL Server可以快速,高效地查找与键值关联的一行或多行。

Indexes are automatically created when PRIMARY KEY and UNIQUE constraints are defined on table columns. For example, when you create a table with a UNIQUE constraint, Database Engine automatically creates a nonclustered index.

如果您配置了PRIMARY KEY,则除非已存在聚簇索引,否则数据库引擎会自动创建聚簇索引。当您尝试在现有表上强制执行PRIMARY KEY约束并且该表上已经存在聚集索引时,SQL Server会使用非聚集索引来强制执行主键。

请参阅此以获取有关索引(群集和非群集)的更多信息:https : //docs.microsoft.com/zh-cn/sql/relational-databases/indexes/clustered-and-nonclustered-indexes- describe?view = sql-server-ver15

希望这可以帮助!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.