什么是索引?

17

MySQL中的索引是什么?

7个回答

19

索引能够加速SELECT查询,因为它们本身就是有序的。此外,唯一索引可以强制确保该列(或绑定列的组合)的值仅存在一次(PRIMARY也是如此,但每个表只能有一个PRIMARY键,与唯一键不同)。

索引是一种权衡:它们可以极大地加速SELECT查询(当使用的列具有索引时),但在通过INSERT/UPDATE/DELETE更改表格时会使MySQL表格占用更多空间并花费更多时间。


15
在上面的帖子中提到,指数就像书的索引。想象一下你有一本食谱书,你想找到如何制作煎蛋卷的方法,你只需要跳到后面,查找这个词和它所在的页码,然后跳转到该页码。现在想象一下如果没有索引,你必须搜索400页的食谱,那将是多么可怕的事情! - studioromeo
恭喜@Rob成为这里唯一一个用通俗易懂的语言解释索引的人。 - CResults
1
fulltext 是 MySQL 的 MyISAM 存储引擎所特有的一种特殊索引,用于使用自然语言短语搜索记录。不详细介绍,它是 MySQL 自带的搜索引擎,在 like SQL 命令上的进阶版本。 - studioromeo
1
完全匹配只会搜索包含“eggs and butter”字符串的记录,而全文匹配则会搜索包含鸡蛋、黄油或两者都包含的记录。 - studioromeo
谢谢@CResults,我是否应该将这些评论放在答案中,以便其他人可以更容易地阅读它? - studioromeo
@studioromeo碰巧有最好的外行人解释之一,我认为他应该得到一些祝贺。 - Barkermn01

16

索引就像书的目录一样。想象一下,你有一本食谱书,想知道如何制作煎蛋卷,那么你只需要跳到后面,找到单词并查找页码,然后跳到该页码即可。现在想象一下,如果没有目录,你必须搜索400页的菜谱,那将是一场噩梦!

索引有几种类型:主键、索引、唯一键和全文索引。

主键被认为是您的主要索引,MySQL 查找记录的第一个位置。大多数人使用自增整数字段来实现这一点,因为每一行通常是唯一的。

索引被认为是次要主键,您可以将其放置在希望快速搜索的字段上。

唯一键与索引类似,但它通过确保您不能在该列中放置重复值来工作,例如,在两个不同的行中,不能出现相同的单词“鸡蛋”。

最后,全文索引是 MySQL 的 MyISAM 存储引擎专用的特殊索引,用于使用人类语言短语搜索记录。简单说,它是 MySQL 自己的搜索引擎,是 LIKE SQL 命令的更高级版本。

例如,如果我搜索“鸡蛋和黄油”,全文索引将搜索包含鸡蛋、黄油或两者的记录,而 LIKE 只会搜索包含“鸡蛋和黄油”这个字符串的记录。

希望这有所帮助,《MySQL 网站》上有大量关于此主题的信息,但这给您提供了一般概述。

快乐编码 :)


5
索引有两个作用:
1. 指定一个(或多个)唯一标识行的字段(主键)。 2. 在经常使用的字段上进行查找时节省时间。例如,如果您经常通过用户名查找用户,则应在用户名列上添加索引。
在这里阅读更多关于索引的信息:http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html 或者最好买一本适合数据库设计的书籍。
关于您的第二个问题,请查看此处:http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html
主要区别在于TEXT存储在表空间之外,并从表中引用,而VARCHAR则存储为普通字段。在这种情况下,性能完全取决于您的使用模式。TEXT还可以允许全文搜索。
此外,您不能使用TEXT上的索引,原因如上所述,因此将其用作查找字段不是一个好主意。

1

每个数据库表都需要一个主键,我认为这也是主索引。索引用于加速查询,如果您在 SQL 查询的 WHERE 部分中使用了某一列,则应该对该列建立索引以提高性能。

在不需要使用 TEXT 的情况下使用它是不好的。最好限制用户在某些字段(如标题和 URL)上进行输入,因为您已经在 URL 上建立了索引。而且我认为您不能在类型为 TEXT 的列上使用索引。我认为您不需要在 url 上使用 FULLTEXT 索引。

我建议您阅读一些关于数据库的入门文本或网站。


0

索引可以加快查询速度。它们使得数据库不必检查表中的每一行以获取结果,而是知道了到哪里去找到信息。这有点类似于循环遍历字典类型的数据结构来查找所需内容,而不仅仅是通过键(索引)找到所需值。但是,如果您使用了太多的索引,插入、更新和删除操作将会变慢,因为现在每次对表进行更改都必须创建索引。

在极高容量/高性能应用程序中一个流行的策略是拥有两个数据库。一个是为快速检索而优化索引的数据库,另一个则只有很少的索引用于快速插入。唯一的问题是,当检索数据库还未与插入数据库同步时,您将会失去实时数据。

索引还有两种不同的类型:聚集索引和非聚集索引。如果我没记错的话,在MySQL中,主键是聚集索引,而所有其他索引都是非聚集索引。关于这两者的差异介绍,here有一篇不错的文章。虽然它涵盖的是SQL Server,但概念应该是相同的。

我没有太多使用MySQL的经验,但从我在网上看到的来看,FULLTEXT提供了一种使用自然语言全文搜索进行搜索的方法。 基本上,在查询中,您将提供要在其中搜索完整文本索引列的术语,并将返回所有结果。以下是我发现的几篇有关该主题的文章,您可能会发现有用。
MySQL全文搜索文档
文章1
文章2


0

索引是用于优化查询的数据结构。它们在概念上与书后的索引非常相似。它们需要一些空间和时间来维护,就像如果您决定添加新章节,则必须重新制作书籍索引一样。但是它们通常可以极大地加速查询(比没有索引时快数千甚至数百万倍)。


0
如果您知道每个人都有一个唯一的社会安全号码(SSN),那么您可以创建一个按照SSN排序的每个人姓名的索引。然后,如果您获得了某人的SSN,就可以很快地找到他们的姓名。
现在假设您为每个人都有一个信封,里面可能有详细的医疗记录等等。您的数据库可能没有按顺序保留这些信封 - 也许它只是将新的信封添加到紧凑文件末尾。但它确实保持了排序的“索引”,以便如果您查找某个SSN,则可以告诉您相关信封的确切位置。
在此示例中,SSN被用作主键。如果它是唯一的,那就很好,但即使它不是唯一的,它仍然可以加速操作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接