MySQL 之全文索引
概念
通常数值比较、范围过滤等就可以完成绝大多数我们需要的查询,但是,如果希望通过关键字的匹配来进行查询过滤,那么就需要基于相似度的查询,而不是原来的精确数值比较。全文索引就是为这种场景设计的。
当然,用 like + % 就可以实现模糊匹配了,为什么还要全文索引?like + % 在文本比较少时是合适的,但是对于大量的文本数据检索,是不可想象的。全文索引在大量的数据面前,能比 like + % 快 N 倍,速度不是一个数量级,但是全文索引可能存在精度问题。
常见的各种的搜索引擎,虽然搜索引擎的索引对象是超大量的数据,并且通常其背后都不是关系型数据库,不过全文索引的基本原理是一样的。
mysql 版本支持
全文索引的版本、存储引擎、数据类型的支持情况:
1、MySQL 5.6 以前的版本,只有 MyISAM 存储引擎支持全文索引。
2、MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存储引擎均支持全文索引。
3、只有字段的数据类型为 char、varchar、text 及其系列才可以建全文索引。
总之,
MySQL 的全文索引最开始仅支持英语,因为英语的词与词之间有空格,使用空格作为分词的分隔符是很方便的。亚洲文字,比如汉语、日语、汉语等,是没有空格的,这就造成了一定的限制。不过 MySQL 5.7.6 开始,引入了一个 ngram 全文分析器来解决这个问题,并且对 MyISAM 和 InnoDB 引擎都有效。
事实上,MyISAM 存储引擎对全文索引的支持有很多的限制,例如表级别锁对性能的影响、数据文件的崩溃、崩溃后的恢复等,这使得 MyISAM 的全文索引对于很多的应用场景并不适合。所以,多数情况下的建议是使用别的解决方案,例如 Sphinx、Lucene 等等第三方的插件,亦或是使用 InnoDB 存储引擎的全文索引。
几个注意点:
1、使用全文索引前,搞清楚版本支持情况;
2、全文索引比 like + % 快 N 倍,但是可能存在精度问题;
3、如果需要全文索引的是大量数据,建议先添加数据,再创建索引;
4、对于中文,可以使用 MySQL 5.7.6 之后的版本,或者第三方插件。