> For the complete documentation index, see [llms.txt](https://hezhiqiang-book.gitbook.io/mysql/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://hezhiqiang-book.gitbook.io/mysql/di-liu-zhang/ding-yi-suo-yin.md).

# 定义索引

在本教程中，您将学习如何定义全文索引，以便在MySQL中执行各种全文搜索。

在表的列中执行全文搜索之前，必须对其数据进行索引。 每当列的数据更改时，MySQL将重新创建全文索引。在MySQL中，全文索引是一种名称为`FULLTEXT`的索引。

MySQL支持对全文搜索启用列自动建立索引和重新索引数据。 MySQL 5.6或更高版本允许您为数据类型为`MyISAM`中的`CHAR`，`VARCHAR`或`TEXT`或`InnoDB`[表类型](http://www.yiibai.com/mysql/understand-mysql-table-types-innodb-myisam.html)的列定义全文索引。 请注意，自MySQL5.6版以来，MySQL支持`InnoDB`表的全文索引。

MySQL允许您在使用[CREATE TABLE](http://www.yiibai.com/mysql/create-table.html)语句创建表或为现有表使用[ALTER TABLE](http://www.yiibai.com/mysql/alter-table.html)或[CREATE INDEX](http://www.yiibai.com/mysql/create-drop-index.html)语句时来定义`FULLTEXT`索引。

## 使用CREATE TABLE语句定义FULLTEXT索引

通常，使用`CREATE TABLE`语句创建新表时，可以为列定义`FULLTEXT`索引，如下所示：

```sql
CREATE TABLE table_name(
 column1 data_type, 
        column2 data_type,
        column3 data_type,
 …
PRIMARY_KEY(key_column),
FULLTEXT (column1,column2,..)
);
```

要创建`FULLTEXT`索引，请在`FULLTEXT`关键字之后的括号中放置逗号分隔列的列表。

以下语句创建一个名为`posts`的新表，该表具有包含`post_content`列的`FULLTEXT`索引。

```sql
CREATE TABLE posts (
  id int(4) NOT NULL AUTO_INCREMENT,
  title varchar(255) NOT NULL,
  post_content text,
  PRIMARY KEY (id),
  FULLTEXT KEY post_content (post_content)
);
```

## 定义现有表的FULLTEXT索引

如果您想要在一个已存在表上定义全文索引，可以使用`ALTER TABLE`语句或`CREATE INDEX`语句。

**使用ALTER TABLE语句定义FULLTEXT索引**

以下语法使用`ALTER TABLE`语句定义`FULLTEXT`索引：

```sql
ALTER TABLE  table_name  
ADD FULLTEXT(column_name1, column_name2,…)
```

将`table_name`指定为一列或多列定义`FULLTEXT`索引的`ADD FULLTEXT`子句。

例如，可以在[示例数据库(yiibaidb)](http://www.yiibai.com/mysql/sample-database.html)的`products`表中为`productDescription`和`productLine`列定义`FULLTEXT`索引，如下所示：

```sql
ALTER TABLE products  
ADD FULLTEXT(productDescription,productLine)
```

### 使用CREATE INDEX语句定义FULLTEXT索引

还可以使用`CREATE INDEX`语句为现有表创建`FULLTEXT`索引。 请参阅以下语法：

```sql
CREATE FULLTEXT INDEX index_name
ON table_name(idx_column_name,...)
```

以下语句为`offices`表的`addressLine1`和`addressLine2`列创建一个`FULLTEXT`索引。

```sql
CREATE FULLTEXT INDEX address
ON offices(addressLine1,addressLine2)
```

请注意，对于具有多行的表，首先将数据加载到没有`FULLTEXT`索引的表中，然后创建`FULLTEXT`索引，而不是将大量数据加载到具有现有`FULLTEXT`索引的表中，先加载数据后创建索引速度更快。

### 删除全文搜索列

要删除`FULLTEXT`索引，只需使用`ALTER TABLE ... DROP INDEX`语句删除索引。 例如，以下语句删除了`offices`表中名称为`address`的`FULLTEXT`索引，可使用以下语句 -

```sql
ALTER TABLE offices
DROP INDEX address;
```

在本教程中，我们向您展示了如何定义和删除支持MySQL全文搜索的`FULLTEXT`索引。
