使用索引時(shí)數(shù)據(jù)庫(kù)性能優(yōu)化的必備技能之一。在MySql數(shù)據(jù)庫(kù)中,有四種索引:聚焦索引(主鍵索引)、普通索引、唯一索引以及我們這里將要介紹的全文索引(FUNLLTEXT INDEX)。
全文索引(也稱全文檢索)是目前搜索引擎使用的一種關(guān)鍵技術(shù)。它能夠利用【分詞技術(shù)】等多種算法智能分析出文本文字中關(guān)鍵詞的頻率和重要性,然后按照一定的算法規(guī)則智能地篩選出我們想要的搜索結(jié)果。
在MySql中,創(chuàng)建全文索引相對(duì)比較簡(jiǎn)單。例如:我們有一個(gè)文章表(article),其中有主鍵ID(id)、文章標(biāo)題(title)、文章內(nèi)容(content)三個(gè)字段。現(xiàn)在我們希望能夠在title和content兩個(gè)列上創(chuàng)建全文索引,article表及全文索引的創(chuàng)建SQL語(yǔ)句如下:
CREATE TABLE `article` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(200) DEFAULT NULL,
`content` text,
PRIMARY KEY (`id`),
FULLTEXT KEY `title` (`title`,`content`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
上面就是在創(chuàng)建表的同時(shí)創(chuàng)建全文索引的SQL示例。此外,如果我們要給已經(jīng)存在的表的指定字段創(chuàng)建全文索引,同樣以article表為例,我們可以使用如下SQL語(yǔ)句進(jìn)行創(chuàng)建:
ALTER TABLE article ADD FULLTEXT INDEX fulltext_article(title,content);
在MySql中創(chuàng)建全文索引之后,現(xiàn)在就該了解如何使用了。眾所周知,在數(shù)據(jù)庫(kù)中進(jìn)行模糊查詢是使用like關(guān)鍵字進(jìn)行查詢的,例如:
SELECT * FROM article WHERE content LIKE ‘%查詢字符串%';
那么,我們?cè)谑褂萌乃饕策@樣使用嗎?當(dāng)然不是,我們必須使用特有的語(yǔ)法才能使用全文索引進(jìn)行查詢,例如,我們想要在article表的title和content列中全文檢索指定的查詢字符串,我們可以如下編寫SQL語(yǔ)句:
SELECT * FROM article WHERE MATCH(title,content) AGAINST (‘查詢字符串');
強(qiáng)烈注意:MySql自帶的全文索引只能用于數(shù)據(jù)庫(kù)引擎為MYISAM的數(shù)據(jù)表,如果是其他數(shù)據(jù)引擎,則全文索引不會(huì)生效。此外,MySql自帶的全文索引只能對(duì)英文進(jìn)行全文檢索,目前無(wú)法對(duì)中文進(jìn)行全文檢索。如果需要對(duì)包含中文在內(nèi)的文本數(shù)據(jù)進(jìn)行全文檢索,我們需要采用Sphinx(斯芬克斯)/Coreseek技術(shù)來(lái)處理中文。
注:目前,使用MySql自帶的全文索引時(shí),如果查詢字符串的長(zhǎng)度過(guò)短將無(wú)法得到期望的搜索結(jié)果。MySql全文索引所能找到的詞默認(rèn)最小長(zhǎng)度為4個(gè)字符。另外,如果查詢的字符串包含停止詞,那么該停止詞將會(huì)被忽略。
注:如果可能,請(qǐng)盡量先創(chuàng)建表并插入所有數(shù)據(jù)后再創(chuàng)建全文索引,而不要在創(chuàng)建表時(shí)就直接創(chuàng)建全文索引,因?yàn)榍罢弑群笳叩娜乃饕室摺?/p>
您可能感興趣的文章:- MySQL 全文索引的原理與缺陷
- MySQL全文索引、聯(lián)合索引、like查詢、json查詢速度哪個(gè)快
- MySQL全文索引實(shí)現(xiàn)簡(jiǎn)單版搜索引擎實(shí)例代碼
- MySQL全文索引應(yīng)用簡(jiǎn)明教程
- 基于mysql全文索引的深入理解
- MySQL 全文索引使用指南