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

时间:2010-11-04 03:59:34

标签: database database-indexes database-optimization

在各种ORM的文档中,它们总是提供创建索引等的方法。他们总是提到要确保为效率创建适当的索引,就好像这是非手写SQLer需要的固有知识使用ORM。我对索引(PK之外)的理解基本上是:如果您打算根据列的内容进行LIKE查询(即搜索),则应该为该列使用全文索引。关于指数(主要与效率有关),我还应该知道什么?我觉得我的门口有一个知识世界,但是它下方有一个巨大的折叠式鼠标垫,所以我无法通过(我不知道为什么我觉得我需要这么说,但是谢谢你提供沙发。)

2 个答案:

答案 0 :(得分:22)

将索引看作非常类似于书后面的索引。这是一本与书内容完全分开的区域,如果你正在寻找一些特定的价值,你可以去索引查找(索引是有序的,所以在那里找东西要比扫描书的每一页都快得多) )。

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

所以......当你有经常搜索的信息时,你会创建一个索引。普通索引不能帮助你进行'部分'搜索,就像LIKE查询一样,但是当你需要得到一组结果,其中字段X具有某些值时,它们会使DBMS无需“扫描”整个表,寻找匹配的价值。

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

要记住的另一件事;如果DBMS允许您创建具有多个字段的单个索引,请务必调查这样做的效果,特定于您的DBMS。如果在查询中使用所有这些字段,则包含多个字段的索引可能只是完全(或根本)有用。相反,对于单个表具有多个索引(每个索引具有一个字段),对于通过多个字段进行过滤/排序的查询可能没有太多(或任何)帮助。


您提到了全文索引和PK(主键)。这些与常规索引不同,但它们通常用于类似目的。

首先,请注意主键通常是一个索引(在MSSQL中,实际上是一个“聚簇索引”),但具体情况并非如此。例如,MSSQL PK默认为Clustered Index;聚簇索引的特殊之处在于它们不是存储在别处的单独数据位,而是数据本身按聚类索引顺序排列在表中。这就是流行的PK是int值的原因,该值是使用连续的增加值自动生成的。因此,聚集索引特定地按字段的值对表中的数据进行排序。将此与传统字典进行比较;条目本身由'key'排序,'key'是定义的单词。

但是在MSSQL中(请查看您的DBMS文档以获取您的信息),如果您愿意,可以将Clustered Index更改为其他字段。有时这是在基于datetime的字段上完成的。


全文索引完全是不同种类的野兽。他们使用了一些相同的原则,但他们所做的与普通索引并不完全相同,我正在描述。另外:在某些DBMS中,LIKE查询使用全文索引;需要特殊的查询运算符。

这些索引是不同的,因为它们的意图不是查找/排序列的整个值(数字,日期,短数据字符数据),而是在文本字段中查找单个单词/短语(s)被索引。

他们还经常能够搜索相似的单词,不同的时态,常见的拼写错误等,并且通常会忽略噪音词。它们工作的不同方式是为什么他们也可能需要不同的操作员来使用它们。 (再次,查看您的DBMS的本地文档!)

答案 1 :(得分:1)

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

How to choose and optimize oracle indexes?