【问题标题】:What is an index in SQL?SQL中的索引是什么?
【发布时间】:2011-02-26 16:20:49
【问题描述】:

另外,什么时候适合使用?

【问题讨论】:

    标签: sql indexing


    【解决方案1】:

    索引用于加速在数据库中的搜索。 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

    【讨论】:

    • "索引也可以是唯一索引..." 只是为了和你确认一下,这是否意味着索引可以是非唯一的?我一直认为它是独一无二的。我对 SQL 很陌生,请原谅我
    • @DanielKurniadi 大多数索引不是唯一的。我可能有一个用户数据库,想查询住在哥德堡的每个人。 “城市”字段上的索引会加快我的查询速度。但是哥德堡有超过 1 个用户,因此索引必须是非唯一的。
    【解决方案2】:

    聚集索引就像电话簿的内容。您可以在“Hilditch, David”打开这本书,并找到所有“Hilditch”的所有信息。这里聚集索引的键是 (lastname, firstname)。

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

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

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

    想象一下,如果您必须在电话簿中搜索所有居住在“伦敦”的人 - 仅使用聚集索引,您将不得不搜索电话簿中的每个项目,因为聚集索引上的键是 on (姓氏,名字),因此居住在伦敦的人随机分布在整个索引中。

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

    希望有帮助!

    【讨论】:

    • 如果你是像我这样的新手,甚至不知道什么索引是。
    • 聚集索引的命名可能很糟糕——它们实际上只是该表所有数据的物理有序存储。我猜它们被称为“聚集”,因为聚集索引非常适合基于范围的查询。例如如果您的聚集索引键位于 DateCreated 上,则运行 SELECT * from table where DateCreated BETWEEN 2020-01-01 和 2020-02-01 之类的查询非常快。非聚集索引实际上只是额外的索引 - 您有指向页码的索引键(来自聚集索引),可以找到该数据的所有事件。
    【解决方案3】:

    索引用于提高查询的性能。它通过减少必须访问/扫描的数据库数据页的数量来做到这一点。

    在 SQL Server 中,聚集索引决定了表中数据的物理顺序。每个表只能有一个聚集索引(聚集索引就是表)。表上的所有其他索引都称为非聚集索引。

    【讨论】:

      【解决方案4】:

      索引都是为了快速查找数据

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

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

      Index Basics
      Clustered and Non-Clustered Indexes
      Unique and Non-Unique Indexes
      Advantages and disadvantages of indexes

      【讨论】:

      • 阅读所有答案让我想知道为什么不索引所有内容。 +1 包含包含缺点的链接。
      • @LakshayGarg 有时不必要的索引也会减慢查询的执行时间,所以我们不应该尝试索引所有内容。就像每件事都有它自己的优点和缺点一样。
      • @LakshayGarg Gaurav Rajdeo 是对的。也保持相同的类比:您可能希望为书中的每个章节、图形或表格编制索引,但不是每个段落、句子或单词。通常,这将是一种矫枉过正的做法,并会导致不必要的复杂化。希望这与此答案中绘制的图片足够接近。
      【解决方案5】:

      一般来说索引是B-tree。有两种类型的索引:聚集的和非聚集的。

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

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

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

      【讨论】:

      • 一般来说,它是一个b-tree而不是一个二叉树。
      • 所以,因为索引使用自平衡树,每次添加/删除一行时,它都会自行平衡 - 使插入/删除更昂贵......对吗?
      【解决方案6】:

      INDEXES - 轻松查找数据

      UNIQUE INDEX - 不允许重复值

      INDEX 的语法

      CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);
      

      UNIQUE INDEX 的语法

      CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);
      

      【讨论】:

        【解决方案7】:

        首先我们需要了解正常(没有索引)查询是如何运行的。它基本上是一一遍历每一行,当它找到它返回的数据时。参考下图。 (此图取自video。)

        所以假设查询是找到 50 ,它将必须读取 49 条记录作为线性搜索。

        参考下图。 (此图取自video

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

        【讨论】:

        • 我观看了此答案中链接的视频。很好,值得一读。
        【解决方案8】:

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

        当您的查询包含 WHERE 过滤器时,更特别适用于基于索引的搜索。否则,即没有 WHERE 过滤器的查询会选择整个数据和进程。在没有 INDEX 的情况下搜索整个表称为 Table-scan。

        您将以清晰可靠的方式找到有关 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

        【讨论】:

          【解决方案9】:

          如果您使用的是 SQL Server,那么最好的资源之一就是它自己的联机丛书,它是随安装一起提供的!对于任何与 SQL Server 相关的主题,这是我第一个参考的地方。

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

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

          【讨论】:

            【解决方案10】:

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

            【讨论】:

              【解决方案11】:

              索引是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

              希望这会有所帮助!

              【讨论】:

                【解决方案12】:

                那么,索引实际上是如何工作的?

                首先,当我们在列上放置索引以优化查询性能时,数据库表不会自行重新排序。

                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

                【讨论】:

                  【解决方案13】:

                  INDEX 不是 SQL 的一部分。 INDEX 在物理级别创建平衡树以加速 CRUD。

                  SQL 是一种描述概念级别架构和外部级别架构的语言。 SQL 没有描述物理层架构。

                  创建 INDEX 的语句由 DBMS 定义,而不是 SQL 标准。

                  【讨论】:

                    猜你喜欢
                    • 2015-03-16
                    • 1970-01-01
                    • 2020-05-17
                    • 1970-01-01
                    • 1970-01-01
                    • 2013-02-08
                    • 2011-08-17
                    • 1970-01-01
                    • 1970-01-01
                    相关资源
                    最近更新 更多