【发布时间】:2011-02-26 16:20:49
【问题描述】:
另外,什么时候适合使用?
【问题讨论】:
另外,什么时候适合使用?
【问题讨论】:
索引用于加速在数据库中的搜索。 MySQL 有一些关于这个主题的很好的文档(这也与其他 SQL 服务器相关): http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html
索引可用于有效地查找与查询中某个列匹配的所有行,然后仅遍历表的该子集以查找精确匹配。如果您在 WHERE 子句中的任何列上都没有索引,SQL 服务器必须遍历整个表并检查每一行以查看它是否匹配,这可能是在大桌子上运行缓慢。
索引也可以是UNIQUE 索引,这意味着该列中不能有重复值,或者PRIMARY KEY,在某些存储引擎中它定义了值在数据库文件中的存储位置。
在 MySQL 中,您可以在 SELECT 语句前面使用 EXPLAIN 来查看您的查询是否会使用任何索引。这是解决性能问题的良好开端。在这里阅读更多:
http://dev.mysql.com/doc/refman/5.0/en/explain.html
【讨论】:
聚集索引就像电话簿的内容。您可以在“Hilditch, David”打开这本书,并找到所有“Hilditch”的所有信息。这里聚集索引的键是 (lastname, firstname)。
这使得聚集索引非常适合基于基于范围的查询检索大量数据,因为所有数据都彼此相邻。
由于聚簇索引实际上与数据的存储方式有关,因此每个表只有一个可能(尽管您可以作弊来模拟多个聚簇索引)。
非聚集索引的不同之处在于您可以拥有许多索引,然后它们指向聚集索引中的数据。你可以有例如电话簿后面的非聚集索引,键入(城镇,地址)
想象一下,如果您必须在电话簿中搜索所有居住在“伦敦”的人 - 仅使用聚集索引,您将不得不搜索电话簿中的每个项目,因为聚集索引上的键是 on (姓氏,名字),因此居住在伦敦的人随机分布在整个索引中。
如果您在 (town) 上有一个非聚集索引,则可以更快地执行这些查询。
希望有帮助!
【讨论】:
索引用于提高查询的性能。它通过减少必须访问/扫描的数据库数据页的数量来做到这一点。
在 SQL Server 中,聚集索引决定了表中数据的物理顺序。每个表只能有一个聚集索引(聚集索引就是表)。表上的所有其他索引都称为非聚集索引。
【讨论】:
索引都是为了快速查找数据。
数据库中的索引类似于您在书中找到的索引。如果一本书有索引,我要求你在该书中找到一个章节,你可以借助索引快速找到它。另一方面,如果这本书没有索引,您将不得不花更多的时间通过从头到尾查看每一页来寻找章节。
以类似的方式,数据库中的索引可以帮助查询快速找到数据。如果您不熟悉索引,以下视频可能非常有用。事实上,我从他们身上学到了很多。
Index Basics
Clustered and Non-Clustered Indexes
Unique and Non-Unique Indexes
Advantages and disadvantages of indexes
【讨论】:
一般来说索引是B-tree。有两种类型的索引:聚集的和非聚集的。
聚集索引创建行的物理顺序(它可以只有一个,并且在大多数情况下它也是主键 - 如果您在表上创建主键,您也会在此表上创建聚集索引)。
非聚集索引也是二叉树,但它不会创建行的物理顺序。所以非聚集索引的叶子节点包含PK(如果存在)或行索引。
索引用于提高搜索速度。因为复杂度是 O(log N)。索引是一个非常大且有趣的话题。我可以说在大型数据库上创建索引有时是一种艺术。
【讨论】:
INDEXES - 轻松查找数据
UNIQUE INDEX - 不允许重复值
INDEX 的语法
CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);
UNIQUE INDEX 的语法
CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);
【讨论】:
INDEX 是一种性能优化技术,可加快数据检索过程。它是一种与表(或视图)相关联的持久数据结构,以便在从该表(或视图)中检索数据时提高性能。
当您的查询包含 WHERE 过滤器时,更特别适用于基于索引的搜索。否则,即没有 WHERE 过滤器的查询会选择整个数据和进程。在没有 INDEX 的情况下搜索整个表称为 Table-scan。
您将以清晰可靠的方式找到有关 Sql-Indexes 的准确信息: 请点击以下链接:
【讨论】:
如果您使用的是 SQL Server,那么最好的资源之一就是它自己的联机丛书,它是随安装一起提供的!对于任何与 SQL Server 相关的主题,这是我第一个参考的地方。
如果可行,“我应该怎么做?”类型的问题,那么 StackOverflow 将是一个更好的提问场所。
另外,我已经有一段时间没有回来了,但 sqlservercentral.com 曾经是与 SQL Server 相关的顶级站点之一。
【讨论】:
index 用于几个不同的原因。主要原因是为了加快查询速度,以便您可以更快地获取行或对行进行排序。另一个原因是定义一个主键或唯一索引,以保证没有其他列具有相同的值。
【讨论】:
索引是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
希望这会有所帮助!
【讨论】:
首先,当我们在列上放置索引以优化查询性能时,数据库表不会自行重新排序。
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://pankajtanwar.in/blog/what-is-the-sorting-algorithm-behind-order-by-query-in-mysql
【讨论】:
INDEX 不是 SQL 的一部分。 INDEX 在物理级别创建平衡树以加速 CRUD。
SQL 是一种描述概念级别架构和外部级别架构的语言。 SQL 没有描述物理层架构。
创建 INDEX 的语句由 DBMS 定义,而不是 SQL 标准。
【讨论】: