MySQL在高并发连接、数据库记录数较多的情况下,SELECT … WHERE … LIKE ‘%…%’的全文搜索方式不仅效率差,而且以通配符%开头作查询时,使用不到索引,需要全表扫描,对数据库的压力也很大。MySQL针对这一问题提供了一种全文索引解决方案,这不仅仅提高了性能和效率(因为MySQL对这些字段做了索引来优化搜索),而且实现了更高质量的搜索。但是,至今为止,MySQL对中文全文索引无法正确支持。Mysqlcft 是张宴为 MySQL 5.1.22 ~ 5.1.25 RC 开发的中文全文索引插件,用于解决MySQL无法正确支持中文全文检索的问题。在这里介绍一下这个插件的使用.
对于这个插件的具体信息,可以参考网址:http://code.google.com/p/mysqlcft/.
下面是这个插件的安装配置与使用过程。。。
mysql> show plugins;
+————+——–+—————-+———+———+
| Name | Status | Type | Library | License |
+————+——–+—————-+———+———+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
| ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| CSV | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL |
| InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
+————+——–+—————-+———+———+
9 rows in set (0.00 sec)
–以root帐号登陆mysql
mysql> INSTALL PLUGIN mysqlcft SONAME ‘mysqlcft.so’;
Query OK, 0 rows affected (0.01 sec)
mysql> SELECT * FROM mysql.plugin;
+———-+————-+
| name | dl |
+———-+————-+
| mysqlcft | mysqlcft.so |
+———-+————-+
1 row in set (0.00 sec)
mysql> SHOW PLUGINS;
+————+——–+—————-+————-+———+
| Name | Status | Type | Library | License |
+————+——–+—————-+————-+———+
| binlog | ACTIVE | STORAGE ENGINE | NULL | GPL |
| partition | ACTIVE | STORAGE ENGINE | NULL | GPL |
| ARCHIVE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| BLACKHOLE | ACTIVE | STORAGE ENGINE | NULL | GPL |
| CSV | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MEMORY | ACTIVE | STORAGE ENGINE | NULL | GPL |
| InnoDB | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MyISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| MRG_MYISAM | ACTIVE | STORAGE ENGINE | NULL | GPL |
| mysqlcft | ACTIVE | FTPARSER | mysqlcft.so | GPL |
+————+——–+—————-+————-+———+
10 rows in set (0.00 sec)
如果要卸载mysqlcft.so插件,执行以下SQL语句(如果已经创建了mysqlcft索引,请先删除mysqlcft索引,再卸载mysqlcft.so插件):
UNINSTALL PLUGIN mysqlcft;
CREATE DATABASE `mysqlcft_gbk` DEFAULT CHARACTER SET gbk;
USE `mysqlcft_gbk`;
CREATE TABLE `test` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(200) DEFAULT NULL,
`body` mediumtext,
PRIMARY KEY (`id`),
FULLTEXT KEY `title_body` (`title`,`body`) WITH PARSER mysqlcft
) ENGINE=MyISAM DEFAULT CHARSET=gbk;
INSERT INTO `mysqlcft_gbk`.`test` (`id`, `title`, `body`) VALUES (NULL, ‘北京房价’, ‘北京市统计局、国家统计局北京调查总队近日联合对外发布消息,今年以来,北京的商品房价格一直呈上升趋势,五环路以内住宅期房均价已涨至13754元/平方米。’);
INSERT INTO `mysqlcft_gbk`.`test` (`id`, `title`, `body`) VALUES (NULL, ‘北京中心城区今起可无线宽带上网 奥运期间免费’, ‘新浪科技讯 6月25日消息,北京无线城市一期网络今日起试运行,即日起北京市民和海外游客可以通过无线网络在北京中心城区接入互联网。’);
INSERT INTO `mysqlcft_gbk`.`test` (`id`, `title`, `body`) VALUES (NULL, ‘数据库’, ‘欢迎使用MySQL中文全文索引插件mysqlcft!’);
SELECT * FROM mysqlcft_gbk.test WHERE MATCH(title,body) AGAINST (’13754元/平方米’ IN BOOLEAN MODE);
SELECT * FROM mysqlcft_gbk.test WHERE MATCH(title,body) AGAINST (’6月25日’ IN BOOLEAN MODE);
SELECT * FROM mysqlcft_gbk.test WHERE MATCH(title,body) AGAINST (‘北京’ IN BOOLEAN MODE);
SELECT * FROM mysqlcft_gbk.test WHERE MATCH(title,body) AGAINST (‘北京 宽带’ IN BOOLEAN MODE);
SELECT * FROM mysqlcft_gbk.test WHERE MATCH(title,body) AGAINST (‘mysqlcft’ IN BOOLEAN MODE);
SELECT * FROM mysqlcft_gbk.test WHERE MATCH(title,body) AGAINST (‘数据’ IN BOOLEAN MODE);
反复执行insert into test(title,body) select title,body from test;
mysql> select count(*) from test;
+———-+
| count(*) |
+———-+
| 49152 |
+———-+
1 row in set (0.00 sec)
索引文件将近是表数据文件的10倍,还有当前mysqlcft插件只支持myisam存储引擎
[mysql@my101 mysqlcft_gbk]$ ls -lh
total 74M
-rw-rw—- 1 mysql mysql 59 Nov 24 10:24 db.opt
-rw-rw—- 1 mysql mysql 8.5K Nov 24 10:24 test.frm
-rw-rw—- 1 mysql mysql 6.4M Nov 24 10:31 test.MYD
-rw-rw—- 1 mysql mysql 68M Nov 24 10:31 test.MYI
大家可以试试这个插件的功能与性能,也可以尝试着自己写插件…