FULLTEXT 和 FULLTEXT KEY/INDEX 有什么区别?

What is the difference between FULLTEXT and FULLTEXT KEY/INDEX?

MySQL 文档给出了创建全文索引的格式:

| {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...) [index_option]

要使用 MySQL 实现全文搜索,您可以通过以下方式创建索引:

CREATE TABLE posts (
  id int(4) NOT NULL AUTO_INCREMENT,
  title varchar(255) NOT NULL,
  content text,
  PRIMARY KEY (id),
  FULLTEXT (title, content)
  ) ENGINE=MyISAM;

CREATE TABLE posts (
  id int(4) NOT NULL AUTO_INCREMENT,
  title varchar(255) NOT NULL,
  content text,
  PRIMARY KEY (id),
  FULLTEXT KEY my_index_name (title, content)
  ) ENGINE=MyISAM;

使用 my_index_name 用户定义的名称而不是字段名称。

我在文档中找不到任何线索:

省略索引名称

如果您添加 index/key to a table MySQL 将在指定列(列集)上存储附加信息以加快搜索速度。

在您的第一个示例中,MySQL 将生成一个索引并将其命名 my_index_name。如果您省略姓名,MySQL 将为您选择一个。我找不到关于如何选择名称的文档,但根据我的经验,第一列的名称通常被重新用作索引名称。

对于这部分讨论,fulltext 选项无关紧要。它只是定义了您正在创建的 index/key 的类型:

You can create special FULLTEXT indexes, which are used for full-text searches.

省略 index/key 关键字

只要给fulltext:

就够了

| {FULLTEXT|SPATIAL} [INDEX|KEY] [index_name] (index_col_name,...) [index_option] ...

但使用 fulltext index 形式可能是个好主意,因为 reader 会提醒索引。

indexkey是同义词

注意indexkey没有区别(见create table):

KEY is normally a synonym for INDEX. The key attribute PRIMARY KEY can also be specified as just KEY when given in a column definition. This was implemented for compatibility with other database systems.

例子

use test;

create table u (
    id int primary key,
    a varchar(10),
    b varchar(10),
    fulltext index (a, b)
);

show index from u;

将打印(我从这个输出中省略了主索引以及一些 附加列):

table key_name  seq_in_index  column_name
u     a         1             a
u     a         2             b

如果要删除它,您需要索引名称,例如:

alter table u
  drop index a;

参考资料

没有区别,如果您使用第一种语法,那么 mysql 将选择索引的名称,并且在大多数情况下是 column name,因为您有 2 个 FULLTEXT (title, content)它最有可能选择索引名称 title

在第二种情况下,您明确提供了一个名称。

您可以在创建表后运行命令show create table posts查看这两种情况的索引名称。