這篇“MySQL全文索引的概念是什么”文章的知識(shí)點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價(jià)值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來(lái)看看這篇“mysql全文索引的概念是什么”文章吧。
成都創(chuàng)新互聯(lián)公司是一家專業(yè)提供欽州企業(yè)網(wǎng)站建設(shè),專注與網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、html5、小程序制作等業(yè)務(wù)。10年已為欽州眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。
在mysql中,全文索引是將存儲(chǔ)于數(shù)據(jù)庫(kù)中的整本書或整篇文章中的任意信息查找出來(lái)的技術(shù)。通過(guò)數(shù)值比較、范圍過(guò)濾等就可以完成絕大多數(shù)我們需要的查詢,但是,如果希望通過(guò)關(guān)鍵字的匹配來(lái)進(jìn)行查詢過(guò)濾,那么就需要基于相似度的查詢,而不是原來(lái)的精確數(shù)值比較;而全文索引就是為這種場(chǎng)景設(shè)計(jì)的。
概念
全文索引(Full-Text Search)是將存儲(chǔ)于數(shù)據(jù)庫(kù)中的整本書或整篇文章中的任意信息查找出來(lái)的技術(shù)。它可以根據(jù)需要獲得全文中有關(guān)章、節(jié)、段、句、詞等信息,也可以進(jìn)行各種統(tǒng)計(jì)和分析。全文索引一般是通過(guò)倒排索引實(shí)現(xiàn)的。
通過(guò)數(shù)值比較、范圍過(guò)濾等就可以完成絕大多數(shù)我們需要的查詢,但是,如果希望通過(guò)關(guān)鍵字的匹配來(lái)進(jìn)行查詢過(guò)濾,那么就需要基于相似度的查詢,而不是原來(lái)的精確數(shù)值比較。全文索引就是為這種場(chǎng)景設(shè)計(jì)的。
你可能會(huì)說(shuō),用 like + % 就可以實(shí)現(xiàn)模糊匹配了,為什么還要全文索引?like + % 在文本比較少時(shí)是合適的,但是對(duì)于大量的文本數(shù)據(jù)檢索,是不可想象的。全文索引在大量的數(shù)據(jù)面前,能比 like + % 快 N 倍,速度不是一個(gè)數(shù)量級(jí),但是全文索引可能存在精度問(wèn)題。
你可能沒有注意過(guò)全文索引,不過(guò)至少應(yīng)該對(duì)一種全文索引技術(shù)比較熟悉:各種的搜索引擎。雖然搜索引擎的索引對(duì)象是超大量的數(shù)據(jù),并且通常其背后都不是關(guān)系型數(shù)據(jù)庫(kù),不過(guò)全文索引的基本原理是一樣的。
版本支持
開始之前,先說(shuō)一下全文索引的版本、存儲(chǔ)引擎、數(shù)據(jù)類型的支持情況
MySQL 5.6 以前的版本,只有 MyISAM 存儲(chǔ)引擎支持全文索引;
MySQL 5.6 及以后的版本,MyISAM 和 InnoDB 存儲(chǔ)引擎均支持全文索引;
只有字段的數(shù)據(jù)類型為 char、varchar、text 及其系列才可以建全文索引。
測(cè)試或使用全文索引時(shí),要先看一下自己的 MySQL 版本、存儲(chǔ)引擎和數(shù)據(jù)類型是否支持全文索引。
索引的操作隨便一搜都是,這里還是再啰嗦一遍。
創(chuàng)建
創(chuàng)建表時(shí)創(chuàng)建全文索引
create table fulltext_test ( id int(11) NOT NULL AUTO_INCREMENT, content text NOT NULL, tag varchar(255), PRIMARY KEY (id), FULLTEXT KEY content_tag_fulltext(content,tag) // 創(chuàng)建聯(lián)合全文索引列 ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
在已存在的表上創(chuàng)建全文索引
create fulltext index content_tag_fulltext on fulltext_test(content,tag);
通過(guò) SQL 語(yǔ)句 ALTER TABLE 創(chuàng)建全文索引
alter table fulltext_test add fulltext index content_tag_fulltext(content,tag);
修改
修改個(gè) O,直接刪掉重建。
刪除
直接使用 DROP INDEX 刪除全文索引
drop index content_tag_fulltext on fulltext_test;
通過(guò) SQL 語(yǔ)句 ALTER TABLE 刪除全文索引
alter table fulltext_test drop index content_tag_fulltext;
和常用的模糊匹配使用 like + % 不同,全文索引有自己的語(yǔ)法格式,使用 match 和 against 關(guān)鍵字,比如
select * from fulltext_test where match(content,tag) against('xxx xxx');
注意:match() 函數(shù)中指定的列必須和全文索引中指定的列完全相同,否則就會(huì)報(bào)錯(cuò),無(wú)法使用全文索引,這是因?yàn)槿乃饕粫?huì)記錄關(guān)鍵字來(lái)自哪一列。如果想要對(duì)某一列使用全文索引,請(qǐng)單獨(dú)為該列創(chuàng)建全文索引。
添加測(cè)試數(shù)據(jù)
有了上面的知識(shí),就可以測(cè)試一下全文索引了。
首先創(chuàng)建測(cè)試表,插入測(cè)試數(shù)據(jù)
create table test ( id int(11) unsigned not null auto_increment, content text not null, primary key(id), fulltext key content_index(content) ) engine=MyISAM default charset=utf8;insert into test (content) values ('a'),('b'),('c');insert into test (content) values ('aa'),('bb'),('cc');insert into test (content) values ('aaa'),('bbb'),('ccc');insert into test (content) values ('aaaa'),('bbbb'),('cccc');
按照全文索引的使用語(yǔ)法執(zhí)行下面查詢
select * from test where match(content) against('a');select * from test where match(content) against('aa');select * from test where match(content) against('aaa');
根據(jù)我們的慣性思維,應(yīng)該會(huì)顯示 4 條記錄才對(duì),然而結(jié)果是 1 條記錄也沒有,只有在執(zhí)行下面的查詢時(shí)
select * from test where match(content) against('aaaa');
才會(huì)搜到 aaaa 這 1 條記錄。
為什么?這個(gè)問(wèn)題有很多原因,其中最常見的就是 最小搜索長(zhǎng)度導(dǎo)致的。另外插一句,使用全文索引時(shí),測(cè)試表里至少要有 4 條以上的記錄,否則,會(huì)出現(xiàn)意想不到的結(jié)果。
MySQL 中的全文索引,有兩個(gè)變量,最小搜索長(zhǎng)度和最大搜索長(zhǎng)度,對(duì)于長(zhǎng)度小于最小搜索長(zhǎng)度和大于最大搜索長(zhǎng)度的詞語(yǔ),都不會(huì)被索引。通俗點(diǎn)就是說(shuō),想對(duì)一個(gè)詞語(yǔ)使用全文索引搜索,那么這個(gè)詞語(yǔ)的長(zhǎng)度必須在以上兩個(gè)變量的區(qū)間內(nèi)。
這兩個(gè)的默認(rèn)值可以使用以下命令查看
show variables like '%ft%';
可以看到這兩個(gè)變量在 MyISAM 和 InnoDB 兩種存儲(chǔ)引擎下的變量名和默認(rèn)值
// MyISAM ft_min_word_len = 4; ft_max_word_len = 84; // InnoDB innodb_ft_min_token_size = 3; innodb_ft_max_token_size = 84;
可以看到最小搜索長(zhǎng)度 MyISAM 引擎下默認(rèn)是 4,InnoDB 引擎下是 3,也即,MySQL 的全文索引只會(huì)對(duì)長(zhǎng)度大于等于 4 或者 3 的詞語(yǔ)建立索引,而剛剛搜索的只有 aaaa 的長(zhǎng)度大于等于 4。
配置最小搜索長(zhǎng)度
全文索引的相關(guān)參數(shù)都無(wú)法進(jìn)行動(dòng)態(tài)修改,必須通過(guò)修改 MySQL 的配置文件來(lái)完成。修改最小搜索長(zhǎng)度的值為 1,首先打開 MySQL 的配置文件 /etc/my.cnf,在 [mysqld] 的下面追加以下內(nèi)容
[mysqld]innodb_ft_min_token_size = 1ft_min_word_len = 1
然后重啟 MySQL 服務(wù)器,并修復(fù)全文索引。注意,修改完參數(shù)以后,一定要修復(fù)下索引,不然參數(shù)不會(huì)生效。
兩種修復(fù)方式,可以使用下面的命令修復(fù)
repair table test quick;
或者直接刪掉重新建立索引,再次執(zhí)行上面的查詢,a、aa、aaa 就都可以查出來(lái)了。
但是,這里還有一個(gè)問(wèn)題,搜索關(guān)鍵字 a 時(shí),為什么 aa、aaa、aaaa 沒有出現(xiàn)結(jié)果中,講這個(gè)問(wèn)題之前,先說(shuō)說(shuō)兩種全文索引。
自然語(yǔ)言的全文索引
默認(rèn)情況下,或者使用 in natural language mode 修飾符時(shí),match() 函數(shù)對(duì)文本集合執(zhí)行自然語(yǔ)言搜索,上面的例子都是自然語(yǔ)言的全文索引。
自然語(yǔ)言搜索引擎將計(jì)算每一個(gè)文檔對(duì)象和查詢的相關(guān)度。這里,相關(guān)度是基于匹配的關(guān)鍵詞的個(gè)數(shù),以及關(guān)鍵詞在文檔中出現(xiàn)的次數(shù)。在整個(gè)索引中出現(xiàn)次數(shù)越少的詞語(yǔ),匹配時(shí)的相關(guān)度就越高。相反,非常常見的單詞將不會(huì)被搜索,如果一個(gè)詞語(yǔ)的在超過(guò) 50% 的記錄中都出現(xiàn)了,那么自然語(yǔ)言的搜索將不會(huì)搜索這類詞語(yǔ)。上面提到的,測(cè)試表中必須有 4 條以上的記錄,就是這個(gè)原因。
這個(gè)機(jī)制也比較好理解,比如說(shuō),一個(gè)數(shù)據(jù)表存儲(chǔ)的是一篇篇的文章,文章中的常見詞、語(yǔ)氣詞等等,出現(xiàn)的肯定比較多,搜索這些詞語(yǔ)就沒什么意義了,需要搜索的是那些文章中有特殊意義的詞,這樣才能把文章區(qū)分開。
布爾全文索引
在布爾搜索中,我們可以在查詢中自定義某個(gè)被搜索的詞語(yǔ)的相關(guān)性,當(dāng)編寫一個(gè)布爾搜索查詢時(shí),可以通過(guò)一些前綴修飾符來(lái)定制搜索。
MySQL 內(nèi)置的修飾符,上面查詢最小搜索長(zhǎng)度時(shí),搜索結(jié)果 ft_boolean_syntax 變量的值就是內(nèi)置的修飾符,下面簡(jiǎn)單解釋幾個(gè),更多修飾符的作用可以查手冊(cè)
+必須包含該詞
-必須不包含該詞
>提高該詞的相關(guān)性,查詢的結(jié)果靠前
<降低該詞的相關(guān)性,查詢的結(jié)果靠后
(*)星號(hào)通配符,只能接在詞后面
對(duì)于上面提到的問(wèn)題,可以使用布爾全文索引查詢來(lái)解決,使用下面的命令,a、aa、aaa、aaaa 就都被查詢出來(lái)了。
select * test where match(content) against('a*' in boolean mode);
以上就是關(guān)于“mysql全文索引的概念是什么”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對(duì)大家有幫助,若想了解更多相關(guān)的知識(shí)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。