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

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

我将如何使用它们?


#1楼

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

  • 如果选择性足够,简单的KEY / INDEX (或称为SECONDARY INDEX )确实可以提高性能。 在此问题上,通常的建议是,如果在其中应用了索引的结果集中的记录量超过了父表记录总数的20%,则该索引将无效。 实际上,每种体系结构都会有所不同,但是这个想法仍然是正确的。

  • 次要索引(并且非常特定于mysql)不应被视为与主键完全独立且不同的对象。 实际上,两者应结合使用,并且一旦知道了这些信息,便可以为mysql DBA提供一个附加工具:在Mysql中,索引嵌入了主键。 它带来了显着的性能改进,特别是在巧妙地构建隐式覆盖索引(如此处所述)时

  • 如果您认为数据应该是UNIQUE ,请使用唯一索引。 您可能会认为它是可选的(例如,在应用程序级别进行操作),并且可以使用普通索引,但是实际上它代表了Mysql的保证,即每一行都是唯一的,这顺便提供了性能上的好处。

  • 您只能在Innodb(在MySQL 5.6.4及更高版本中)和Myisam Engines中使用FULLTEXT (或称为SEARCH INDEX

  • 您只能对CHARVARCHARTEXT列类型使用FULLTEXT
  • FULLTEXT索引所涉及的不仅仅是创建索引。 创建了一堆系统表,一个完全独立的缓存系统,并应用了一些特定的规则和优化。 参见http://dev.mysql.com/doc/refman/5.7/en/fulltext-restrictions.htmlhttp://dev.mysql.com/doc/refman/5.7/en/innodb-fulltext-index.html

#2楼

所有这些都是指数。

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

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

索引:如果它不是主要的或唯一的,则不会限制插入表中的值,但确实可以更有效地查找它们。

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


#3楼

差异性

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

  • UNIQUE引用一个索引,其中索引的所有行都必须是唯一的。 也就是说,对于该索引中的所有列,同一行可能不具有与另一行相同的非NULL值。 除了用于快速达到某些记录范围外,UNIQUE索引还可以用于对数据施加约束,因为数据库系统不允许在插入或更新数据时打破唯一值规则。

    您的数据库系统可能允许将UNIQUE索引应用于允许NULL值的列,在这种情况下,如果两行都包含NULL值,则允许两行相同(此处的理由是NULL被视为不等于其自身)。 但是,根据您的应用程序,您可能会发现这是不希望的:如果希望防止这种情况,则应在相关列中禁止使用NULL值。

  • PRIMARY的行为与UNIQUE索引完全相同,不同之处在于它始终被命名为“ PRIMARY”,并且表上可能只有一个(并且应该总是一个;尽管某些数据库系统不强制执行此操作)。 PRIMARY索引旨在作为唯一标识表中任何行的主要手段,因此与UNIQUE不同,它不应在任何允许NULL值的列上使用。 您的PRIMARY索引应位于足以唯一标识一行的最少列数上。 通常,这只是一列,其中包含一个唯一的自动递增的数字,但是,如果还有其他任何东西可以唯一地标识一行,例如国家列表中的“国家/地区代码”,则可以改用它。

    某些数据库系统(例如MySQL的InnoDB)会将表的记录存储在磁盘上,顺序是它们在PRIMARY索引中出现的顺序。

  • FULLTEXT索引与上述所有索引均不同,并且它们的行为在数据库系统之间也存在很大差异。 FULLTEXT索引仅对使用MATCH()/ AGAINST()子句进行的全文搜索有用,与上述三个不同(通常在内部使用b树(允许选择,排序或从最左列开始的范围)实现)哈希表(允许从最左边的列开始选择)。

    在其他索引类型是通用索引的情况下,FULLTEXT索引是专用的,因为它的作用范围很窄:它仅用于“全文搜索”功能。

相似点

  • 所有这些索引中可能都包含不止一列。

  • 除FULLTEXT外,列顺序很重要:要使索引在查询中有用,查询必须使用从左开始的索引中的列-它不能仅使用索引的第二,第三或第四部分。索引,除非它也使用索引中的前几列来匹配静态值。 (为使FULLTEXT索引对查询有用,该查询必须使用索引的所有列。)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值