MySQL全文索引在高并发、数据库记录数较多的情况下,select.where.like '%_%'的全文搜索方式不仅效率差,而且以通配符%和_开头做查询时,使用不到索引,需要权标扫描,对数据库的压力也很大。MySQL针对这一问题提供了一种全文索引FULLTEXT解决方案,这不仅仅提高了性能和效率(因为MySQL对 这些字段做了索引来优化搜索),而且实现了更高质量的搜索。但是,迄今为止,MySQL对中文全文索引无法正确支持。
中文与西方文字如英文的一个重要区别在于,西方文字以单词为单位,单词与单词之间用空格分隔。而中文以字为单位,词由一个或多个字组成,词与词之间没有空格分隔。当试图在一个含有中文字符的字段中使用全文搜索时,不会得到正确的结果,原因在于中文中没有像空格那样对词定界,不能以空格进行分隔,对中文词语进行索引。
一、Mysql中文全文索引插件mysqlcft的特点:
1.优点:
①精确度很高;采用自创的“三字节交叉切分算法”,对中文语句进行分割,无中文分词词库,搜索精准度远比中文分词算法高,能达到LIKE '%.%'的准确率。
②查询速度快:查询速度比LIKE '%.%'搜索快3~50倍
③标准插件式:以MySQL5.1全文索引的标准插件形式开发,不修改MySQL源代码,不影响MySQL其他功能,可快速跟进MySQL新版本
④支持版本多:支持所有的MySQL 5.1 Release Canidate版本,即MySQL 5.1.22 RC 最新的MySQL 5.1.25 RC
⑤支持字符集:支持包括GBK、GB2312、UTF-8、Latinl、BIG5在内的MySQL字符集
⑥系统兼容好:具有i386和x86_64两个版本,支持32位(i386)和64位(x86_64)及Linux系统
⑦适合分布式:非常适合MySQL Slave分布式系统架构,无词库维护成本,不存在词库同步问题。
2.缺点:
①mysqlcft中文全文索引只适用于MyISAM引擎表,因为MySQL只支持对MyISAM表建立FULLTEXT索引
②MySQL不能静态编译安装,否则无法安装mysqlcft插件
③基于“三字节交叉切分算法”的索引文件会比海量、ft-hightman等基于“中文分词算法”的所有文件稍大,但不是很多
二、使用
1.MySQL必须是动态编译安装,以便加载动态链接库
2.Linux系统下编辑MySQL配置文件my.cnf(Windows编辑my.ini)
配置文件中添加:
[mysqld]
ft_min_word_len=1
附:MySQL配置文件在全文索引应用中的优化
#key_buffer指定用于索引的缓冲区大小,在全文索引中,增加它可得到更好的索引处理与查询性能
key_buffer=512M
#sort_buffer_size为查询排序时说能使用的缓冲区大小,全文索引的SQL语句之后通常会使用ORDER BY排序,增加它可以加快SQL语句执行时间。该参数对应的分配内存是每连接独占,100个连接使用的内存将是32M*100=3200M
sort_buffer_size=32M
#对大于可用内存的表执行GROUP BY 或ORDER BY操作,应增加read_rnd_buffer_size的值以加速排序操作后面的行读取
rend_rnd_buffer_size=64M
#如果表出现故障或索引出错,REPAIR TABLE时用到的缓冲区大小
myisam_sort_buffer_size=128M
#确定使用的filesort算法的索引值大小的限制
max_length_for_sort_data=64
#MySQL全文索引查询所用关键字最小长度限制(不要改变这项值)
ft_min_word_len=1
#降低UPDATE优先级,设置查询优先
low_priority_updates=1
3.安装mysqlcft中文全文索引插件
查看插件目录 show variables like 'plugin_dir';
下载mysqlcft插件,解压复制到插件目录下
安装mysqlcft插件 install plugin mysqlcft soname 'mysqlcft.so';
查看所有的插件 show plugins;如果有找到mysqlcft则表示安装成功
4.给表添加中文全文索引
alert table 表名 add fulltext 索引名(列名) with parser mysqlcft;
5.全文索引的查找
select * from 表名 where match(字段) against('查找的值' in boolean mode);