SQL中的索引是什么?你能解释或参考清楚地理解吗?
我应该在哪里使用索引?
答案 0 :(得分:321)
索引用于加速数据库中的搜索。 MySQL有关于这个主题的一些很好的文档(这也与其他SQL服务器相关): http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
索引可用于有效地查找与查询中某些列匹配的所有行,然后仅遍历表的该子集以查找完全匹配。如果WHERE
子句中的任何列上没有索引,SQL
服务器必须遍历整个表并检查每一行以查看它是否匹配,这可能是对大桌子的缓慢操作。
索引也可以是UNIQUE
索引,这意味着您不能在该列中具有重复值,或者PRIMARY KEY
在某些存储引擎中定义数据库文件中存储值的位置
在MySQL中,您可以在EXPLAIN
语句前使用SELECT
来查看您的查询是否会使用任何索引。这是解决性能问题的良好开端。在这里阅读更多:
http://dev.mysql.com/doc/refman/5.0/en/explain.html
答案 1 :(得分:152)
聚集索引就像电话簿的内容。你可以在'Hilditch,David'打开这本书,找到所有'Hilditch'彼此相邻的所有信息。这里聚集索引的键是(lastname,firstname)。
这使得聚簇索引非常适合基于基于范围的查询检索大量数据,因为所有数据都彼此相邻。
由于聚簇索引实际上与数据的存储方式有关,因此每个表中只有一个可能存在(尽管你可以欺骗模拟多个聚簇索引)。
非聚集索引的不同之处在于,您可以拥有许多索引,然后指向聚簇索引中的数据。你可以有例如电话簿背面的非聚集索引(城镇,地址)
想象一下,如果您必须在电话簿中搜索所有居住在“伦敦”的人 - 只有聚集索引,您必须搜索电话簿中的每个项目,因为聚簇索引上的密钥已打开(姓氏,名字)因此,居住在伦敦的人们在整个指数中随机分散。
如果(town)上有非聚集索引,则可以更快地执行这些查询。
希望有所帮助!
答案 2 :(得分:135)
一个非常好的比喻是将数据库索引视为书中的索引。如果您有一本关于国家的书,并且您正在寻找印度,那么为什么要翻阅整本书 - 这相当于数据库术语中的全表扫描 - 当您可以转到后面的索引时本书,它将告诉您有关印度信息的确切页面。同样,由于book索引包含页码,因此数据库索引包含指向包含要在SQL中搜索的值的行的指针。
答案 3 :(得分:79)
索引用于加速查询的性能。它通过减少必须访问/扫描的数据库数据页的数量来实现这一目的。
在SQL Server中,集群索引确定表中数据的物理顺序。每个表只能有一个聚簇索引(聚簇索引是表)。表上的所有其他索引都称为非群集。
答案 4 :(得分:42)
索引就是快速查找数据。
数据库中的索引类似于您在书中找到的索引。如果一本书有索引,并且我要求你在那本书中找到一章,你可以在索引的帮助下快速找到它。另一方面,如果这本书没有索引,你将不得不花费更多时间通过查看书中从开头到结尾的每一页来查找章节。
以类似的方式,数据库中的索引可以帮助查询快速查找数据。如果您不熟悉索引,则以下视频非常有用。事实上,我从中学到了很多东西。
Index Basics
Clustered and Non-Clustered Indexes
Unique and Non-Unique Indexes
Advantages and disadvantages of indexes
答案 5 :(得分:22)
通常,索引是B-tree
。索引有两种类型:聚簇索引和非聚簇索引。
群集索引创建行的物理顺序(它可以只有一个,在大多数情况下它也是主键 - 如果在表上创建主键,则在此表上创建聚簇索引也是)。
非聚簇索引也是二叉树,但它不会创建行的物理顺序。因此非聚簇索引的叶节点包含PK(如果存在)或行索引。
索引用于提高搜索速度。因为复杂性是O(log N)。索引是一个非常大而有趣的话题。我可以说在大型数据库上创建索引有时是某种艺术。
答案 6 :(得分:19)
INDEXES
- 轻松查找数据
UNIQUE INDEX
- 不允许重复值
INDEX
CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);
UNIQUE INDEX
CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);
答案 7 :(得分:11)
INDEX是一种性能优化技术,可加速数据检索过程。它是一个与表(或视图)关联的持久数据结构,以便在从该表(或视图)检索数据期间提高性能。
当您的查询包含WHERE过滤器时,更具体地应用基于索引的搜索。否则,即没有WHERE过滤器的查询选择整个数据和过程。在没有INDEX的情况下搜索整个表称为表扫描。
您将以清晰可靠的方式找到Sql-Indexes的确切信息: 请点击这些链接:
答案 8 :(得分:10)
首先,我们需要了解正常(不带索引)查询如何运行。它基本上逐行遍历每一行,并在找到数据时返回。请参考下图。 (此图像是从video处拍摄的。)
因此,假设查询要查找50,则它将必须读取49条记录作为线性搜索。
请参考下图。 (这张图片是从video处拍摄的)
当我们应用索引编制时,查询将通过消除每次遍历中的一半数据(如二进制搜索)而快速查找数据而无需读取每个数据。 mysql索引存储为B树,其中所有数据都在叶节点中。
答案 9 :(得分:7)
如果您使用的是SQL Server,那么最好的资源之一就是安装附带的自己的联机丛书!这是我参考任何SQL Server相关主题的第一个地方。
如果实际“我应该怎么做?”那些问题,然后StackOverflow会是一个更好的问题。
此外,我还没有回来一段时间,但sqlservercentral.com曾经是SQL Server相关网站之一。
答案 10 :(得分:6)
使用index有几种不同的原因。主要原因是加快查询速度,以便您可以更快地获取行或排序行。另一个原因是定义主键或唯一索引,以确保没有其他列具有相同的值。
答案 11 :(得分:1)
索引是一种对多个字段上的多个记录进行排序的方法。在表中的字段上创建索引会创建另一个数据结构,该数据结构保存该字段值以及指向与其相关的记录的指针。然后对该索引结构进行排序,从而可以对其执行二进制搜索。
答案 12 :(得分: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/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view=sql-server-ver15
希望这会有所帮助!
答案 13 :(得分:0)
好吧,首先,当我们在列上放置索引以优化查询性能时,数据库表不会自行重新排序。
An index is a data structure, (most commonly its B-tree {Its balanced tree, not binary tree}) that stores the value for a specific column in a table.
B-tree 的主要优点是其中的数据是可排序的。与此同时,B-Tree数据结构具有时间效率,搜索、插入、删除等操作可以在对数时间内完成。
所以索引看起来像这样 -
这里对于每一列,它会被映射到一个指向行的确切位置的数据库内部标识符(指针)。而且,现在如果我们运行相同的查询。
因此,索引只是将时间复杂度从 o(n) 降低到 o(log n)。
详细信息 - https://blog.pankajtanwar.in/how-database-indexing-actually-works-internally