ChatGPT解决这个技术问题 Extra ChatGPT

MySQL中INDEX、PRIMARY、UNIQUE、FULLTEXT之间的区别?

创建 MySQL 表时,PRIMARY、UNIQUE、INDEX 和 FULLTEXT 有什么区别?

我将如何使用它们?

也适用于对 SPATIAL 感兴趣的任何人:stackoverflow.com/questions/2256364/…
有关 Python 中主索引和二级索引的比较,请参阅这篇文章 stackoverflow.com/questions/59918440/secondary-index-in-python

C
Community

差异

KEY 或 INDEX 指的是普通的非唯一索引。索引的非不同值是允许的,因此索引可能包含在索引的所有列中具有相同值的行。这些索引不会对您的数据实施任何限制,因此它们仅用于访问 - 用于快速到达特定范围的记录而无需扫描所有记录。

UNIQUE 是指索引的所有行都必须唯一的索引。也就是说,对于该索引中的所有列,同一行可能不会与另一行具有相同的非 NULL 值。除了用于快速达到某些记录范围外,UNIQUE 索引还可用于对数据实施约束,因为数据库系统不允许在插入或更新数据时破坏不同值规则。您的数据库系统可能允许将 UNIQUE 索引应用于允许 NULL 值的列,在这种情况下,如果两行都包含 NULL 值,则允许它们相同(这里的基本原理是 NULL 被认为不等于自身)。但是,根据您的应用程序,您可能会发现这是不可取的:如果您希望阻止这种情况,您应该在相关列中禁止 NULL 值。

PRIMARY 的作用与 UNIQUE 索引完全一样,只是它始终命名为“PRIMARY”,并且一张表上可能只有一个(并且应该始终有一个;尽管某些数据库系统不强制执行此操作)。 PRIMARY 索引旨在作为唯一标识表中任何行的主要手段,因此与 UNIQUE 不同,它不应用于任何允许 NULL 值的列。您的 PRIMARY 索引应位于足以唯一标识行的最少列数上。通常,这只是包含唯一自动递增数字的一列,但如果还有其他可以唯一标识一行的内容,例如国家列表中的“国家代码”,您可以使用它来代替。一些数据库系统(例如 MySQL 的 InnoDB)会按照它们在 PRIMARY 索引中出现的顺序将表的记录存储在磁盘上。

FULLTEXT 索引与上述所有索引都不同,它们的行为在数据库系统之间存在显着差异。 FULLTEXT 索引仅对使用 MATCH() / AGAINST() 子句完成的全文搜索有用,这与上述三个不同 - 通常在内部使用 b-trees 实现(允许从最左边的列开始选择、排序或范围)或哈希表(允许从最左边的列开始选择)。在其他索引类型是通用的地方,一个 FULLTEXT 索引是专门的,因为它服务于一个狭窄的目的:它只用于“全文搜索”功能。

相似之处

所有这些索引中可能包含多于一列。

除了 FULLTEXT 之外,列顺序很重要:要使索引在查询中有用,查询必须使用从左侧开始的索引中的列 - 它不能只使用索引的第二、第三或第四部分索引,除非它还使用索引中的先前列来匹配静态值。 (要使 FULLTEXT 索引对查询有用,查询必须使用索引的所有列。)


这是否意味着如果您在查询中不使用 MATCH() / AGAINST(),FULLTEXT 索引本质上是无用的并且会占用大量空间?
是的。它也只用于 MySQL 上的 MyISAM 数据库,而不是 InnoDB。其他数据库服务器可能具有可能以不同方式工作的等效功能。
这里的基本原理是 NULL 被认为不等于它自己 .. 大声笑我不会忘记这一点
这就是为什么我们在查询中有 IS NULL 和 IS NOT NULL
@thomasrutter MySQL 从 5.6 版开始支持 InnoDB 中的 FULLTEXT
u
user

所有这些都是指数的种类。

primary:必须是唯一的,是一个索引,是(可能)物理索引,每个表只能是一个。

独特的:正如它所说。这个值的元组不能超过一行。请注意,由于唯一键可以超过一列,这并不一定意味着索引中的每个单独的列都是唯一的,而是这些列中的每个值组合都是唯一的。

index:如果它不是主要的或唯一的,它不会限制插入到表中的值,但它确实允许更有效地查找它们。

fulltext:一种更专业的索引形式,允许全文搜索。将其视为(本质上)为指定列中的每个“单词”创建一个“索引”。


在 MySQL(和许多其他 DB)中,主数据库可以是复合的,即多键。它们只是一个特殊的索引。唯一性并不是真正的索引,它是一个约束(它确实需要一个索引在合理的时间内强制执行,从而创建一个)。
G
Gordan Bobić

我觉得这已经很好地涵盖了,也许除了以下内容:

如果选择性足够,简单的 KEY / INDEX(或称为 SECONDARY INDEX)确实会提高性能。关于这个问题,通常的建议是,如果应用了索引的结果集中的记录数量超过了父表记录总数的 20%,那么索引将失效。在实践中,每种架构都会有所不同,但这个想法仍然是正确的。

二级索引(这是 mysql 特有的)不应被视为与主键完全分离且不同的对象。事实上,两者都应该联合使用,一旦知道了这些信息,就可以为 mysql DBA 提供一个额外的工具:在 Mysql 中,索引嵌入了主键。它带来了显着的性能改进,特别是在巧妙地构建隐式覆盖索引时,例如那里描述的。

如果您觉得您的数据应该是唯一的,请使用唯一索引。您可能认为它是可选的(例如,在应用程序级别解决)并且普通索引就可以,但它实际上代表了对 Mysql 的保证,即每一行都是唯一的,这顺便提供了性能优势。

您只能将 FULLTEXT(或称为 SEARCH INDEX)与 Innodb(在 MySQL 5.6.4 及更高版本中)和 Myisam 引擎一起使用

您只能在 CHAR、VARCHAR 和 TEXT 列类型上使用 FULLTEXT

FULLTEXT 索引涉及的不仅仅是创建索引。创建了一堆系统表,一个完全独立的缓存系统和一些特定的规则和优化应用。请参阅 http://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.html 和 http://dev.mysql.com/doc/refman/5.7/en/innodb-fulltext-index.html