Chinaunix首页 | 论坛 | 博客
  • 博客访问: 126290
  • 博文数量: 44
  • 博客积分: 2115
  • 博客等级: 大尉
  • 技术积分: 390
  • 用 户 组: 普通用户
  • 注册时间: 2009-04-05 19:58
文章分类

全部博文(44)

文章存档

2012年(4)

2011年(1)

2009年(39)

我的朋友

分类: Mysql/postgreSQL

2009-05-11 17:22:22

最近在做一个测试按照事前的分析,使用我的方法后查询数据库并计算所需时间应该提高了好几十倍或好几百倍,但是结果却并不是我想象的那样,只提高了10%左右,很是纳闷。最后我经过排查找到是数据库在设计时有问题没有建立索引,经过测试发现大部分的时间都花在了查询运算了,通过mysql客户端工具Navicat设置索引但是有以下三个选项不知什么意思:
  1.    normal
  2. unique
  3. full text  
最后在网上海寻终于知道答案,先总结如下:
  1. normal:最基本的索引状态,所建立的索引项可以重复。
  2. unique:与normal唯一不同的是所建立的索引项不能有重复
  3. full text:全文搜索。对于这一项我在这里转载一篇文章非常好,这此先谢过该文章作者了!
连接地址为:

MySQL中全文索引的使用

MySQL支持全文索引(Full-Text) 已经很久了,目前,fulltext是一种只适用于MyISAM表的一个索引类型,而且对定义索引列的数据类型也有限制,只能是以下三种的组合char、 varchar、text。fulltext可以在创建表的同时就一起定义好,或者在表创建完成之后,通过语句alter table或create index来追加索引,总之先后的效果是一样的,但是两者的效率却是存在很大差异的,大量的实验证明,对于大数量的表来说,先加载数据再来定义全文索引的 速度要远远优于在一个已经定义好全文索引的表里面插入大量数据的速度。一定会问:这是问什么呢?其实,道理很简单,前者只需要一次性对你的索引列表进行操 作,排序比较都是在内存中完成,然后写入硬盘;后者则要一条一条去硬盘中读取索引表然后再进行比较最后写入,自然这样速度就会很慢。是 通过match()和against()这两个函数来实现它的全文索引查询的功能。match()中的字段名称要和fulltext中定义的字段一致,如 果采用boolean模式搜索,也允许只包括fulltext中的某个字段,不需要全部列出。against()中定义的是所要搜索的字符串以及要求数据 库通过哪种模式去执行全文索引的搜索查询。下面通过一个例子分别介绍一下fulltext所支持的3中搜索模式。

1.Natural Language Full-Text Searches

fulltext1

分析一下两个结果的差别。mysqlsystems表中有5条记录,第一条select语句对mysql字符串进行匹配,结果relevance显示都是0,说明没有匹配的匹配度为零,事实上你也看到有4条记录中都含有要搜索的mysql,但为什么MySQL会告诉我们没有呢?第二条搜索的结果,和我们预期的一样。

Trips: 1.在两次查询中我们也没有去指定采用哪种方式去使用fulltext,这时MySQL会把natural language作为默认的搜索模式。2.默认不区分大小写,如果把字符集设置成latin1_bin, 就可以让fulltext搜索时区分大小写。3.默认查询字符串最小值是4,也就是说太短了的话MySQL就会忽略它,设置成零匹配。 4.fulltext会忽略stopword列表中定义的单词,如果这些单词出现在查询字符串里,返回的结果一样是zero relevance。5.fulltext在natural language mode下要遵守50%这个阀值,如果查询字符串在一半以上(包括一半)的纪录里出现,那么查询结果为零。现在,该明白了上面的那个输出了。

2.Boolean Full-Text Searches

fulltext2

你 会发现这次使用mysql搜索,结果就是你最初想要看到的,有4条匹配纪录。这就是boolean搜索,它不受50%阀值的限制,但是还是会考虑 stopword list。boolean有许多operator,例如:+、-、” 或是就不使用operator,这些操作符可以配合搜索字符串使用。下面就是一个使用operators的搜索。

fulltext3 

3.Full-Text Searches with Query Expansion

在手册中你会看到这么一个词”blind”来进一步去描述query expanison,留意的话还会看到这么一个词组”implied knowledge”。下面我们来看看query expansion模式的fulltext搜索结果。

fulltext41

你 会发现纪录3中并没有database这个要搜索的目标字符串,但是却有1点几匹配度。这里MySQL会认为mysql这个单词属于database这个 范畴,那么尽管这条记录没有出现database,还发现7和8两条记录DB2和Oracle也属于database这个概念,但是却没有出现匹配,2和 3又是什么原因呢。

这就是MySQL Full-Text Searches。希望大家能更多分享在这方面的实际应用。

NOTE:还是很好奇,有些疑惑,然后就又插入了一条记录,记录8出现了,但是之后又作了一些纪录进去,8又不见了。

fulltext54

阅读(3341) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~