Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Database 我如何知道何时为列编制索引,以及使用什么索引?_Database_Database Indexes_Database Optimization - Fatal编程技术网

Database 我如何知道何时为列编制索引,以及使用什么索引?

Database 我如何知道何时为列编制索引,以及使用什么索引?,database,database-indexes,database-optimization,Database,Database Indexes,Database Optimization,在各种ORM的文档中,它们总是提供一种创建索引的方法,等等。它们总是提到确保创建适当的索引以提高效率,就好像这是需要使用ORM的非手写SQLer的固有知识一样。我对索引(PK之外)的理解基本上是:如果您计划基于某个列的内容进行之类的查询(即搜索),那么应该为该列使用全文索引。关于索引(主要与效率有关),我还应该知道什么?我觉得在我的门口台阶上有一个知识的世界,但它下面塞满了一个巨大的折叠鼠标垫,所以我无法通过(我不知道为什么我觉得我需要这么说,但感谢提供沙发)。这个答案是Oracle特有的,但答

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

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


想象一下一个索引,它与书后面的索引非常相似。这是一个与书中内容完全不同的区域,如果你想寻找某个特定的值,你可以去索引中查找(索引是有序的,因此在那里查找内容比扫描书中的每一页要快得多)

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

所以。。。当您有需要经常搜索的信息时,您可以创建一个索引。普通索引对“部分”查找之类的查询没有帮助,但当您需要在字段X具有特定值的情况下获得一组结果时,它们使DBMS不需要“扫描”整个表,寻找匹配的值

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

还有一件事要记住;如果DBMS允许您创建具有多个字段的单个索引,请确保针对您的DBMS调查这样做的效果。包含多个字段的索引只有在查询中使用所有这些字段时才可能完全(或根本)有用。相反,为一个表使用多个索引,每个索引有一个字段,对于按多个字段过滤/排序的查询可能没有多大(或任何)帮助


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

首先,请注意,主键通常是一个索引(在MSSQL中,实际上是一个“聚集索引”),但这不需要特别说明。例如,MSSQL PK默认为聚集索引;聚集索引的特殊之处在于,它们不是存储在别处的单独数据位,而是数据本身按照聚集索引的顺序排列在表中。这就是为什么一个流行的PK是一个
int
值,它是用顺序递增的值自动生成的。因此,聚集索引专门根据字段值对表中的数据进行排序。把它和传统的字典比较一下;条目本身按“键”排序,键是定义的单词

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


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

这些索引不同,因为它们的目的不是查找/排序列的整个值(数字、日期、一小段字符数据),而是查找要索引的文本字段中的单个单词/短语


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

谢谢。顺便说一句,你那张照片到底是怎么回事,那是真人吗?!太好了,谢谢。因此,基本上索引只是一列值的列表,每个值都有一个指向正确行的链接(我假设这就是PK)。否则,DBMS必须遍历表中的行,在扫描结果时只查看相关列。如果这(大致)是正确的,你的回答对我帮助很大。@orokusaki我按照你的说明编辑了你的评论。(Mods可以在没有时间限制的情况下进行编辑)。澄清得好!