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 会提醒索引。
index
和key
是同义词
注意index
和key
没有区别(见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;
参考资料
- 您可以在 create index and create table 找到相关文档。
- 更多信息请访问:http://dev.mysql.com/doc/refman/5.0/en/index-hints.html
没有区别,如果您使用第一种语法,那么 mysql 将选择索引的名称,并且在大多数情况下是 column name
,因为您有 2 个 FULLTEXT (title, content)
它最有可能选择索引名称 title
在第二种情况下,您明确提供了一个名称。
您可以在创建表后运行命令show create table posts
查看这两种情况的索引名称。
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 会提醒索引。
index
和key
是同义词
注意index
和key
没有区别(见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;
参考资料
- 您可以在 create index and create table 找到相关文档。
- 更多信息请访问:http://dev.mysql.com/doc/refman/5.0/en/index-hints.html
没有区别,如果您使用第一种语法,那么 mysql 将选择索引的名称,并且在大多数情况下是 column name
,因为您有 2 个 FULLTEXT (title, content)
它最有可能选择索引名称 title
在第二种情况下,您明确提供了一个名称。
您可以在创建表后运行命令show create table posts
查看这两种情况的索引名称。