600字范文,内容丰富有趣,生活中的好帮手!
600字范文 > MySQL的全文索引Fulltext Index | 包括ngram

MySQL的全文索引Fulltext Index | 包括ngram

时间:2020-01-08 22:42:24

相关推荐

MySQL的全文索引Fulltext Index | 包括ngram

InnoDB的全文索引使用反向索引的设计。反向索引存储了一个单词(word)列表,对于每个单词,都有一个文档的列表,来标识这个单词出现的地方。为了支持临近搜索(proximity search),每个单词的位置信息也以字节偏移的方式存储。

当创建了InnoDB全文索引,一系列的索引表会一同被创建,见下面的例子:

最前面的六个表包含了反向索引,它们被称作附属索引表(auxiliary index table)。当输入的表被索引(tokenized)后,每个独立的单词(亦称作“tokens”)会被携带其DOC_ID和位置信息插入到索引表中。根据单词第一个字符的字符集排序权重,在六个索引表中对单词进行完全排序和分区。

反向索引分区到六个附属索引表以支持并行的索引创建。默认有2个线程复制索引(Tokenize)、排序、插入单词和关联数据到索引表中。工作的线程的数量由 innodb_ft_sort_pll_degree 配置项控制的。对于大表的全文索引,可以考虑增加线程数量。

如果主表创建在 xx表空间,索引表存储在它们自己的表空间中。反之,索引表存储于其索引的表空间中。

前面例子展示的另外一种索引表被称作通用索引表,它们被用于全文索引的“删除处理(deletion handing)”和存储内部状态。不同于为每个全文索引都各自创建的反向索引表,这组表对特定表的所有全文索引都是共用的。

即使全文索引删掉了,通用索引(Common Index)也会被保留,当全文索引删除后,为这个索引而创建的FTS_DOC_ID列依然保留,因为移除FTS_DOC_ID列会导致重构之前被索引的表。管理FTS_DOC_ID列需要用到通用索引表。

为了防止大量并发读写附属表,InnoDB使用全文索引缓存去临时缓存最近的插入行。在存满并刷入磁盘之前,缓存的内容一直存储在内存之中,可以通过查询 INFORMATION_SCHEMA.INNODB_FT_INDEX_CACHE 表去查看最近缓存的插入行。

缓存和批处理刷新行为避免了对辅助索引表的频繁更新,频繁更新可能会在繁忙的插入和更新期间导致并发访问问题。批处理还避免了对同一个word的多次插入,最大化的减少了重复的条目。相同的word会先merge再刷入到磁盘中,而不是为每个word单独插入,这样提高了插入效率并且使得索引附属表尽可能的小。

全文索引缓存只缓存最近插入的行,查询时,已经刷入磁盘(附属索引表)的数据不会再回到索引缓存中。附属索引表中的内容是直接查询的,最终返回的结果返回前需要将附属索引表的结果和索引缓存中的结果合并。

InnoDB使用被称作DOC_ID的唯一文件描述符,将全文索引中的单词与该单词在文档中的记录映射起来。映射关系需要索引表中的 FTS_DOC_ID 列。在创建全文索引时,如果没有定义 FTS_DOC_ID 列,InnoDB会自动的加入一个隐藏的 FTS_DOC_ID 列。下面是一个例子,

CREATE FULLTEXT INDEX ft_index ON xxxxxxxx(CONTEXT)

[-11-12 18:14:04] [HY000][124] InnoDB rebuilding table to add column FTS_DOC_ID

重点看一下这一行: [HY000][124] InnoDB rebuilding table to add column FTS_DOC_ID ,InnoDB重新构建了这个表,并且添加了一个列 FTS_DOC_ID 。

在CREATE TABLE的过程中添加 FTS_DOC_ID 的时间成本要低于在已经有数据的表上建立全文索引。如果在表加载数据之前定义 FTS_DOC_ID 列,这个表和它的索引都不需要为了新增列而重新构建。如果你不需要考虑 CREATE FULLTEXT INDEX 的性能,可以让InnoDB为你创建 FTS_DOC_ID 列。InnoDB会新增一个隐藏的 FTS_DOC_ID 列,并且在 FTS_DOC_ID 上建立唯一索引(FTS_DOC_ID_INDEX)。如果你想自行创建 FTS_DOC_ID 列,这个列必须定义为 BIGINT UNSIGNED NOT NULL 且命名为FTS_DOC_ID(全大写),如下例子:

如果你自行定义 FTS_DOC_ID 列的话,你需要负责管理这个列,避免空值(empty)或者重复值。 FTS_DOC_ID 的值是不能被重复利用的,所以也就是说 FTS_DOC_ID 的值是需要一直增加的。

或者,你可以在 FTS_DOC_ID 列上创建所必须的唯一索引FTS_DOC_ID_INDEX(全大写)。

mysql> CREATE UNIQUE INDEX FTS_DOC_ID_INDEX on opening_lines(FTS_DOC_ID);

如果你没有创建FTS_DOC_ID_INDEX,InnoDB会自动创建。

在MySQL 5.7.13前,允许最大FTS_DOC_ID与最新的FTS_DOC_ID之间的间隔为10000,在MySQL 5.7.13及之后的版本中,这个允许的间隔为65535。

为了避免重新构建表,FTS_DOC_ID列在删除了全文索引之后依然被保留。

删除被索引文件的一个记录,可能会在附属索引表中产生非常多的小的删除项,在并发访问时,会产生热点问题。为了避免这个问题,每当被索引表中的记录被删除时,会将被删文档的DOC_ID记录在一个特别的 FTS_*_DELETED 表中,同时全文索引中已经索引了的记录依然被保存。在返回查询结果前,使用 FTS_*_DELETED 中的信息去过滤掉已经删除掉了的DOC_ID。这种设计的优势在于删除速度快且消耗低。不好的地方在于索引的大小不能随着记录的删除而立即减少。为了删除已删除记录在全文索引中的项,需要对被索引的表执行OPTIMIZE TABLE,配合[ innodb_optimize_fulltext_only=ON ],去重构全文索引。

细节略,有例子: /doc/refman/5.7/en/innodb-fulltext-index.html

全文搜索只能看到已经提交了的数据。

你可以通过查询下面的INFORMATION_SCHEMA表,来监控或测试InnoDB的一些特殊文本处理。

默认的分词器不支持中文,不能检索到中文中的英文单词。

InnoDB默认的Stopwords:

select * from information_schema.INNODB_FT_DEFAULT_STOPWORD;

SQL中的关键词(保留关键字):

Shell中的关键词:for,while,echo

其他:###, ***, --,

被索引表数据量、索引表数据量

模糊匹配与严格匹配的性能差距

需要将 innodb_optimize_fulltext_only 配置为ON,这里是否需要DBA在MySQL镜像中修改?

innodb_optimize_fulltext_only 设置为ON后,对系统有何影响需要评估。

innodb_optimize_fulltext_only

执行的时间、频率。

MySQL内建的全文检索解析器使用单词之间的空白作为分隔符以标识单词的头尾,但是这里有个限制,对于表意文字,它是没有单词分隔符的。为了解决这个限制,MySQL提供了支持中文、日语、韩语的 ngram 解析器。ngram解析器支持InnoDB和MyISAM。

Ngram是内建在服务中的插件,像其他自建在服务中的插件一样,服务启动时会自动加载它。全文检索的语法参考上面( Section 12.10, “Full-Text Search Functions” ),这里只讨论一些不同的地方。除了单词的最小、最大长度配置项([ innodb_ft_min_token_size ]innodb_ft_max_token_size,ft_min_word_len,ft_max_word_len,全文检索依赖一些配置项都是可以使用的。

Ngram默认索引的单词(token)的大小为2( 2bigram )。例如,索引的大小为2,Ngram解析器解析字符串“abc def”为四个单词元素(tokens):“ab”, “bc”, “de” and “ef”。

ngram token size is configurable using the ngram_token_size configuration option,which has a minimum value of 1 and maximum value of 10.

作为只读变量, ngram_token_size 只能在启动配置或者配置文件中指定

与默认的解析器相差不大,多了一句:xxx WITH PARSER ngram

Ngram在解析时去除空格,如

MySQL内建的默认全文检索解析器将单词与Stopword列表中的做对比,如果单词与Stopword列表中的元素相同的话,这个单词则不会被索引。对于Ngram解析器,Stopword的处理方式不同。Ngram解析器不排除与stopword列表中的条目相等的token,而是排除包含stopwords的token。例如,假设 ngram_token_size=2 ,包含“a,b”的文档将被解析为 “a,” h和“,b”。如果将逗号(“,”)定义为停止字,则 “a,”和“,b”都将不会加入索引中,因为它们包含逗号。

例子:

默认Ngram解析器使用默认的Stopword列表,这里面含有英文的Stopword。如果需要中文的Stopword,需要你自己创建。

Stopword的长度超过 ngram_token_size则会被忽略。

有两个文档,一个包含“ab”,另一个包含“abc”。对于搜索文本“abc”将转换成“ab”,“bc”。

略。

For example, The search phrase “abc” is converted to “ab bc”, which returns documents containing “abc” and “ab bc”.

The search phrase “abc def” is converted to “ab bc de ef”, which returns documents containing “abc def” and “ab bc de ef”. A document that contains “abcdef” is not returned.

使用Ngram解析器好处是支持了中文的检索

般来说WINDOWS目录下的文件不能删,我总结了下电脑的垃圾来源主要在这几个方面,你可以酌情来处理。

1.清除垃圾文件

要区分垃圾文件,我们应从文件的扩展名入手。一般后缀为?.bak、?.chk、?.fts、?.tmp、?.old、?.xlk的文件都是垃圾文件。删除这些垃圾文件我们可以在“开始→查找→文件或文件夹”中输入“?.bak”文件,在下面的“搜索”项中选择“我的电脑”,随后单击查找即可将硬盘中所有扩展名为bak的文件查找出来,然后将它们删除即可。其它类型的垃圾文件也可以用这种方法进行删除。

2.清空Temp文件夹

Temp是一个系统的临时文件夹,在这里面保存的文件都是系统安装软件时保存的一些临时文件。所以定期清除该文件夹中的文件可以为磁盘腾出一些使用空间。直接进入系统默认路径C?\Windows\Temp(Windows 2000/XP默认为C:\Documents and Settings\xxxx\Local Settings\Temp文件夹中)文件夹,删除该文件夹中的所有的文件。

3.清除上网临时文件

经常上网磁盘上会有很多的网页临时文件、上网历史记录、Cookies文件。这些文件对我们用处不大,清除即可。清除的方法是在桌面的右键点选IE图标,选择“属性”命令,随后弹出一个“Internet选项”对话框,在“常规”标签项下点选“删除Cookies”、“删除临时文件”、“清除历史记录”三个按钮即可清除上述文件。

4.清除Outlook中多余的邮件

经常用Outlook收发电子邮件,时间一长Outlook中的“收件箱”和“已发送邮件箱”中会保存很多的邮件,对于没有用的邮件(尤其是带附件的)我们可以将它删除。清除这些邮件时按下键盘上的Ctrl键并连续点选需要清除的邮件,随后将其删除到“已删除邮件箱”,如果要想彻底清除这些邮件我们可以右键单击“已删除邮件箱”,在右键菜单中选择“清空已删除邮件箱文件夹”即可将该文件夹中的邮件彻底删除。

5.删除系统Front文件夹中多余的字体

一定要保留TimesVewRoman和Marlett字体。少装或不装其他的中文字体。删除字体文件时,在控制面板中单击“字体”,随后即可打开字体窗口,在此右键单击需要选择的字体,随后单击”删除”即可。

6.删除Windows的安装备份文件

我们在装完Windows XP后,系统会在windos\sysytem32目录下生成一个Dllcache文件夹,这里都是系统文件的备份文件,占有几百兆的硬盘空间,当Windows XP的系统文件(如.dll文件)被破坏后,它可以在该文件夹中自动提取,如果你自己可以手动在光盘上提取这些文件的话,为了节省硬盘的空间,我们可以将它们删掉。删除方法是在“开始→运行”中输入sfc.exe /purgecache命令,单击“确定” 即可完成。随后我们再查看硬盘已经多了几百兆的剩余空间了。

Windows XP安装后,不仅给系统文件做了备份,而且对驱动程序也进行了相应的备份,就是windows\driver cache\i386目录下的Driver.cab文件,如用处不大或我们已经用“ghost”为系统做了镜像的话,可将此文件夹删除。

7.删除多余输入法

每次安装系统后,程序都默认安装多种输入法,Windows XP自带了几十种输入法,其中包括日文、韩文等等,存放在windows\ime(有些则存放在windows\system32\ime)文件夹中,共有80多兆,这些输入法既占用了硬盘空间,又影响了系统的运行速度,如果这些输入法平时你根本不使用,那么我们可以有选择地将它们删除。删除方法是首先在“任务栏”中右击“输入法”图标,在弹出的快捷菜单中选择“设置”,启动“文字服务和输入语言”对话框,在下面的“已安装服务”中删除多余的输入法,确定退出。然后进入文件夹,在该文件夹下我们可以将相应的输入法(如IMJP8_1、IMKR6_1、imejp98等)文件夹及文件有选择地删除。

8.删除帮助文件

如果你已经对Windows操作很熟练了,可以将系统文件夹中帮助文件和Welcome文件删除。在此我们可以删除一些软件的帮助文件,如Macromedia公司的Authorware 和Dreamweaver每个程序的安装目录都有一个几十兆的Help文件夹,实在庞大,不需要的话将它们删除即可。

9 把系统缓存改在其它盘里,其实系统缓存也是一个占空间比较大的东东

/f?kz=70565424

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。