什么是索引?
Posted
技术标签:
【中文标题】什么是索引?【英文标题】:What is an index? 【发布时间】:2010-04-08 12:25:52 【问题描述】:什么是 mysql 中的索引????
【问题讨论】:
【参考方案1】:索引可以加速 SELECT 查询,因为索引是按定义排序的。此外,UNIQUE 索引强制该列的值(或绑定列的值的组合)仅存在一次的约束(这同样适用于 PRIMARY,但与 UNIQUE 键相比,PRIMARY 每个表只能存在一次)。
索引是一种权衡:它们极大地加快了 SELECT 查询(当使用的列具有索引时),但它们使 MySQL 表在通过 INSERT/UPDATE/DELETE 更改表时消耗更多空间并花费更多时间。
【讨论】:
加上上面的帖子,索引就像一本书的索引。想象一下,您有一本食谱书,并且想了解如何制作煎蛋卷,您只需跳到后面,找到单词及其页码,然后跳到该页码。现在想象一下,您没有索引,不得不搜索 400 页的食谱,真是一场噩梦! 恭喜@Rob 成为这里唯一一个真正用通俗的方式说出索引是什么的人。 全文是mysql的MyISAM存储引擎使用的特殊索引,用于使用人类短语搜索您的记录。不用过多介绍它的mysqls自己的搜索引擎,一个更高级的类似sql命令的版本。 例如。搜索“eggs and butter”,全文将搜索包含eggs、butter 或两者的记录。就像简单地搜索包含“鸡蛋和黄油”的字符串 谢谢@CResults,我是否应该将这些 cmets 放入答案中以便其他人更容易阅读?【参考方案2】:索引就像一本书的索引。想象一下,您有一本食谱书,并且想了解如何制作煎蛋卷,您只需跳到后面,找到单词及其页码,然后跳到该页码。现在想象一下,您没有索引,不得不搜索 400 页的食谱,真是一场噩梦!
索引有几种类型 Primary Key、Index、Unique、Fulltext
Primary Key 被认为是你的主索引,是 mysql 查找记录的第一个位置。大多数人为此使用自动递增整数字段,因为它通常在每一行上都是唯一的。
索引被视为您的辅助主键,您可以将它们放在您希望能够快速搜索的字段中。
唯一键类似于索引,但它们的工作原理是确保您不能在该列中放置重复项,例如,您不能让单词“eggs”出现在同一列的两个不同行中。
最后全文是mysql的MyISAM存储引擎使用的特殊索引,它用于使用人类短语搜索您的记录。无需过多介绍其 mysql 自己的搜索引擎,LIKE sql 命令的更高级版本。
例如,如果我搜索“鸡蛋和黄油”,全文将搜索包含鸡蛋、黄油或两者的记录。其中 LIKE 会简单地搜索包含“鸡蛋和黄油”的字符串
我希望这会有所帮助,mysql site 有很多关于这个主题的信息,但这会给你大致的要点。
编码愉快:)
【讨论】:
【参考方案3】:索引用于两件事:
-
指定一个(或多个)唯一标识行(主键)的字段。
在查找常用字段时节省时间。例如,如果您经常通过用户名查找用户,则应在用户名列上添加索引。
在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 上使用索引,因此将其用作查找字段不是一个好主意。
【讨论】:
【参考方案4】:每个数据库表都需要一个主键,我认为这也是主索引。索引用于加快查询速度,如果出于性能原因在 SQL 查询的WHERE
部分使用该列,则应该有该列的索引。
在不需要的情况下使用TEXT
是不好的。最好限制某些字段的用户,即 title 和 url,因为您在 url 上有一个索引。而且我认为您不能对TEXT
类型的列使用索引。我不认为 url 上的 FULLTEXT
-index 是你想要的。
我建议您阅读介绍性文本或网站中的数据库。
【讨论】:
【参考方案5】:索引是用于优化查询的数据结构。它们在概念上与书后的索引非常相似。它们需要花费一些空间和时间来维护,就像如果您决定添加新章节则必须重做书籍索引一样。但它们通常会极大地加快查询速度(比不使用时快数千甚至数百万倍)。
【讨论】:
【参考方案6】:如果您知道每个人都有一个唯一的社会安全号码 (SSN),那么您可以创建一个按 SSN 排序的每个人姓名的索引。然后,如果您获得了某人的 SSN,那么很快就能找到他们的名字。
现在假设每个人都有一个马尼拉文件夹。该卡可能有详细的医疗记录等。您的数据库可能无法按顺序保存这些卡 - 也许它只是将新文件夹添加到紧凑型的末尾。但它保留了一个排序的“索引”,因此如果您查找 SSN,它可以准确地告诉您相关文件夹的保存位置。
在本例中,SSN 被用作主键。如果它是唯一的就很好,但即使它不是唯一的,它仍然可以加快速度。
【讨论】:
【参考方案7】:索引加快了选择查询。它们在数据库必须检查表中的每一行以获取结果和确切地知道去哪里查找信息之间有所不同。这与遍历字典类型数据结构以查找您要查找的内容而不是仅通过键(索引)查找所需值的概念相同。索引会减慢插入、更新和删除的速度,但如果您有太多索引,因为现在表的每次更改都必须创建索引。
在容量非常大/高性能的应用程序中,一个流行的策略是拥有两个数据库。一种为快速检索而优化索引,另一种为快速插入而索引很少。唯一的问题是,当检索数据库尚未与插入数据库同步时,您会丢失实时数据。
还有两种不同的索引。聚集索引和非聚集索引。如果我没记错的话,在 MySQL 中,主键是聚集的,而所有其他索引都是非聚集的。关于区别的一篇很好的介绍文章是here。它涵盖了 SQL Server,但概念应该相同。
我对 MySQL 的使用并不多,但从我在网上看到的情况来看,FULLTEXT 提供了一种使用自然语言全文搜索进行搜索的方法。基本上,在查询中,您将提供用于搜索全文索引列的术语,它将拉回所有结果。以下是我发现的几篇关于您可能会觉得有用的主题的文章。MySQL Docs on Full Text SearchArticle 1Article 2
【讨论】:
以上是关于什么是索引?的主要内容,如果未能解决你的问题,请参考以下文章