在mysql中使用全文索引
最近的插件出了问题 #1214 - The used table type doesn't support FULLTEXT indexes
作者: falcon
引言:
在使用like进行模糊查询,当数据量大到一定程序的时候,我们会发现查询的效率是相当低下的。下面就此介绍一下mysql提供全文索引和搜索的功能。
正文:
下面是从参考资料里头摘录下来的内容,具体使用见参考资料,那里更详细哦
1) 很多互联网应用程序都提供了全文搜索功能,用户可以使用一个词或者词语片断作为查询项目来定位匹配的记录。在后台,这些程序使用在一个SELECT查询中的LIKE语句来执行这种查询,尽管这种方法可行,但对于全文查找而言,这是一种效率极端低下的方法,尤其在处理大量数据的时候。
MySQL 针对这一问题提供了一种基于内建的全文查找方式的解决方案。在此,开发者只需要简单地标记出需要全文查找的字段,然后使用特殊的MySQL方法在那些字段运行搜索,这不仅仅提高了性能和效率(因为MySQL对这些字段做了索引来优化搜索),而且实现了更高质量的搜索,因为MySQL使用自然语言来智能地对结果评级,以去掉不相关的项目。
2)到 3.23.23 时,MySQL 开始支持全文索引和搜索。全文索引在 MySQL 中是一个 FULLTEXT 类型索引。FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 时或之后使用 ALTER TABLE 或 CREATE INDEX 在 CHAR、VARCHAR 或 TEXT 列上创建。对于大的数据库,将数据装载到一个没有 FULLTEXT 索引的表中,然后再使用 ALTER TABLE (或 CREATE INDEX) 创建索引,这将是非常快的。将数据装载到一个已经有 FULLTEXT 索引的表中,将是非常慢的。
全文搜索通过 MATCH() 函数完成。
下面大概介绍一下创建全文索引的过程,主要有两种办法:
第一种是创建表的时候就创建全文索引,第二种类是在创建表以后再增加全文索引,通过上面的引文我们知道后者比前者有些好处
1、先创建表,然后通过"AlTER TABLE"增加全文索引
mysql> create database ftt; --创建数据库
Query OK, 1 row affected (0.03 sec)
mysql> use ftt; --使用数据库
Database changed
mysql> create table reviews --创建表
-> (
-> id int(5) primary key not null auto_increment,
-> data text
-> );
Query OK, 0 rows affected (0.09 sec)
mysql> INSERT ignore INTO `reviews` (`id`, `data`) VALUES(1, 'Gingerboy has a new singl
e out called Throwing Rocks. It'sgreat!'); --下面三句都是插入数据
Query OK, 1 row affected (0.06 sec)
mysql> INSERT ignore INTO `reviews` (`id`, `data`) VALUES (2, 'Hello all, I really like
the new Madonna single. One of the hottest tracks currently playing...I've bee
n listening to it all day');
Query OK, 1 row affected (0.00 sec)
mysql> INSERT ignore INTO `reviews` (`id`, `data`)VALUES (3, 'Have you heard the new ba
nd Hotter Than Hell?They have five members and they burn their instruments when
they play in concerts. These guys totally rock! Like, awesome, dude!');
Query OK, 1 row affected (0.00 sec)
mysql> alter table reviews add fulltext index (data); --通过alter增加全文索引
Query OK, 3 rows affected (0.16 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql> select id from reviews where match (data) against ('Madonna'); --通过match和against实现全文检索
+----+
| id |
+----+
| 2 |
+----+
1 row in set (0.00 sec)
mysql> select id from reviews where match (data) against ('+Madonna+instruments'
); --搜索出包含Madonna或者instruments的所有记录的id号
+----+
| id |
+----+
| 2 |
| 3 |
+----+
2 rows in set (0.00 sec)
mysql> select id from reviews where match (data) against ('Mado*' in boolean mod
e); --检索出包含Mado的所有记录的id
+----+
| id |
+----+
| 2 |
+----+
1 row in set (0.00 sec)
补充
从上面的结果不难看出,mysql的全文索引和检索支持多关键字,从下面的参考资料,你还可以发现更多实现,看看去哦
2、在创建表的时候就创建全文索引
由于其他的内容和上面差不多,下面只给出创建时的语法
Code:
create <b style="color:black;background-color:#99ff99">table</b> reviews --创建表的同时创建全文索引 ( id int(5) primary key not null auto_increment, data text, <b style="color:white;background-color:#00aa00">fulltext</b>(data) );
[Ctrl+A Select All]
参考资料:
1)如何在MySQL中获得更好的全文搜索结果 http://dev.21tx.com/2006/04/05/10735.html
[主要介绍了全文检索和搜索是怎么用的]
2)mysql全文检索http://www.jolr.com/forum/?display=topic&id=4856&s=371cda7ed1694f669f75610dde769c82
[主要介绍了全文检索的一些语法知识等]
另外,如果想要看最原始的资料,请上mysql官方网站,http://www.mysql.com
2 条留言 访客:0 条 博主:0 条 引用: 2 条
来自外部的引用: 2 条