代码之家  ›  专栏  ›  技术社区  ›  orokusaki

我如何知道何时索引列,以及用什么索引列?

  •  20
  • orokusaki  · 技术社区  · 14 年前

    在各种ORM的文档中,它们总是提供一种创建索引的方法,等等。它们总是提到要确保创建适当的索引以提高效率,就好像这是需要使用ORM的非手写SQLer的固有知识一样。我对索引(PK之外)的理解基本上是:如果您计划这样做 LIKE

    2 回复  |  直到 9 年前
        1
  •  25
  •   Andrew Barber Eric Lafortune    14 年前

    把一个索引想象成一本书后面的索引。这是一个与书内容完全分离的区域,如果你在寻找某个特定的值,你可以去索引并查找它(索引是有序的,所以在那里查找比扫描书的每一页要快得多)。

    索引条目有一个页码,因此您可以快速转到查找主题的页面。数据库索引非常相似;它是数据库中相关信息(索引中包含的字段)的有序列表,包含数据库查找匹配记录的信息。

    所以。。。当您有需要经常搜索的信息时,可以创建索引。普通索引对于“partial”seeks-like查询没有帮助,但是当您需要获得一组结果(其中字段X具有特定值)时,它们会阻止DBMS“扫描”整个表,以查找匹配值。

    当需要对列进行排序时,它们也有帮助。

    另一件要记住的事情是:如果DBMS允许您创建具有多个字段的单个索引,那么一定要研究这样做的效果,特别是对DBMS的影响。包含多个字段的索引只有在查询中使用所有这些字段时才可能完全(或完全)有用。相反,对于按多个字段过滤/排序的查询,为单个表设置多个索引(每个索引有一个字段)可能没有多大帮助。


    您提到了全文索引和PKs(主键)。这些索引与常规索引不同,尽管它们通常有类似的用途。

    int 用连续的、递增的值自动生成的值。因此,聚集索引会根据字段的值对表中的数据进行排序。将其与传统字典进行比较;条目本身是按“key”排序的,而“key”是要定义的单词。

    但是在MSSQL(查看DBMS文档以获取信息)中,如果愿意,可以将聚集索引更改为其他字段。有时这是在 datetime 基于字段。


    全文索引完全是不同种类的野兽。它们使用了一些相同的原则,但它们所做的与我所描述的普通索引并不完全相同。另外:在一些数据库管理系统中, LIKE 查询do 使用全文索引;需要特殊的查询运算符。

    它们还可以经常搜索相似的单词、不同的时态、常见的拼写错误等等,并且通常忽略噪音词。它们的工作方式不同,这就是为什么它们可能还需要不同的运算符来使用它们。(再次检查本地文档中的DBMS!)

        2
  •  1
  •   Community CDub    7 年前

    这个答案是特定于Oracle的,但是答案中的要点适用于大多数关系数据库系统

    How to choose and optimize oracle indexes?