MySQL全文索引是一种高效检索文本数据的机制,尤其适用于大数据量的文本检索场景。全文索引在MySQL中主要用于提升对长文本字段的搜索性能,它能够理解查询字符串中的语义,找出与之最相关的记录。在MySQL 5.6之前,全文索引仅支持MyISAM表引擎,但之后的版本也开始支持InnoDB。
全文索引的应用需要注意以下几点:
1. **创建全文索引**: 全文索引只能应用于`CHAR`, `VARCHAR`, `TEXT`类型的列,并且需要在`FULLTEXT`索引上下文中创建。可以在线创建或在表定义时一起创建。
2. **搜索限制**: 搜索操作必须针对`FULLTEXT`索引列进行,且搜索字符串必须为常量,不能是表中的列名。
3. **选择性限制**: 如果搜索返回的记录超过总记录数的50%,MySQL认为没有匹配结果(仅在自然语言模式下)。
4. **表引擎**: 全文索引在MySQL 5.6之前仅限MyISAM,之后版本的InnoDB也支持。
5. **索引速度**: 在大量数据插入时,先插入数据再创建索引比在已索引表中插入数据要快。
MySQL全文索引提供了三种搜索类型:
1. **自然语言模式**(默认): 不加任何修饰符或使用`IN NATURAL LANGUAGE MODE`。搜索时不考虑特殊字符,过滤掉屏蔽词,返回结果按相关性排序。如果记录选择性超过50%,认为无匹配。
2. **布尔模式** (`IN BOOLEAN MODE`): 使用特殊字符如`+`(必须出现)、`-`(禁止出现)、`>`(左界优先)、`<`(右界优先)等进行逻辑控制,返回结果不按相关性排序。
3. **查询扩展** (`WITH QUERY EXPANSION`): 结合自然语言模式,基于第一次搜索的结果进行二次匹配,找出与原始查询和初始搜索结果相关联的记录。
以下是一些搜索类型的示例:
- **自然语言模式**:`SELECT * FROM product WHERE MATCH(name) AGAINST('auto')`,返回`name`字段中与'auto'相关的记录,结果按相关性排序。
- **布尔模式**:`SELECT * FROM product WHERE MATCH(name) AGAINST('+auto -manual' IN BOOLEAN MODE)`,返回包含'auto'但不包含'manual'的记录,不分相关性。
重要特性包括:
1. **最小单词长度**:可以通过设置`ft_min_word_len`变量调整全文索引中被视为有效单词的最小字符数。
2. **屏蔽词**:MySQL有一份内置的屏蔽词表,包含常见的无意义词汇,可以自定义此列表以适应特定需求。
3. **分词规则**:全文索引将连续的字母数字字符视为一个单词,单引号内的内容也会被视为单词,连续的两个单引号视为分隔符。
通过掌握全文索引的原理和应用,可以有效地优化文本数据的搜索性能,提高用户在数据库中的查找效率。