存储引擎对比
MySQL内置了三种存储引擎,分别是InnoDb
,MyIsam
和MEMORY
,一般情况下,MySQL5.X之后的版本都是使用InnoDb
存储引擎.
三种引擎的对比
InnoDb
- 支持事务操作
- 支持自动增加列
- 具有行级锁定
MyIsam
- 不支持事务,也不支持外键,但是访问速度快
- 对大文本搜索性能较好
Memory
- 目标数据较少,而且需要频繁的被访问
- 采取的存储介质是系统内存,因此访问速度快,但是现在可以使用第三方内存型数据库代替
大文本的读取
综上所述,大文本的数据需要采用MyIsam
存储引擎作为存储.
测试例子:
CREATE TABLE IF NOT EXISTS product_desc
(
prod_id INT NOT NULL,
prod_text text,
FULLTEXT ( prod_text )
) ENGINE = MyIsam;
建立索引可以在创建表时,直接添加,也可以在数据全部导入完毕之后再创建索引.一般而言,后面一种比前面一种的效率更好.
语法
使用Match()
和Against()
函数进行搜索.
例如:
select prod_text
from product_desc
where match(note_text) against('rabbit');
match
中输入需要进行匹配的列,可以是多个列,against
中输入需要匹配的关键词,一般搜索出来的结果不区分大小写.
MyIsam
执行大文本的搜索还是很快的,是因为它内部对大文本建立了索引.
查看优先级
MyIsam
内部究竟是怎么工作的呢?
select prod_text,match(note_text) against('rabbit') as 'rank'
from product_desc;
可以从得出的结果中看到:
- 词靠前的行比词靠后的行的等级优先值更高
MyIsam
内部会存在一些常见无意义的词进行过滤,不做索引- 搜索出来的结果会根据唯一词/索引中词等的总数进行显示
扩展查询
select prod_text
from product_desc
where match(note_text) against('rabbit' with query expansion);
搜索出来的结果不仅除了有关键词之外,还有是关键词当前所在的行所存在的关键词,然后依据这些关键词从数据库取出来的结果.
布尔文本高级搜索
全文本布尔操作符
布尔操作符 | 说明 |
---|---|
+ | 包含,表示单词必须存在 |
- | 排除,表示单词必须不存在 |
> | 包含,而且需要增加单词的优先级 |
< | 包含,但是需要减少单词的优先级 |
~ | 取消词的排序值 |
* | 词尾的通配符 |
“” | 定义一个短语 |
语法
案例:
select prod_text
from product_desc
where match(note_text) against('+rabbit' in Boolean Mode);
搜索当中添加了in Boolean Mode
几个关键词,表示启用布尔搜索
注意:
- 索引全文本时,三个及三个以下的字符的单词是被索引忽略的
- MySQL内部维护了一个非用词(stopword)列表,这些词在索引时将被忽略
- 许多词出现的频率很高,搜索他们没有用处,因此当一个词出现在50%以上的行中,将被忽略
- 表中的行数少于三行,全文本搜索不返回结果
- 忽略单词中的单引号
- 仅在
MyIsam
存储引擎中支持全文本搜索