作者: falcon 發(fā)表日期: 2006-04-25 10:54
復(fù)制鏈接
引言:
在使用like進(jìn)行模糊查詢,當(dāng)數(shù)據(jù)量大到一定程序的時(shí)候,我們會(huì)發(fā)現(xiàn)查詢的效率是相當(dāng)?shù)拖碌摹O旅婢痛私榻B一下mysql提供全文索引和搜索的功能。
正文:
下面是從參考資料里頭摘錄下來的內(nèi)容,具體使用見參考資料,那里更詳細(xì)哦
1)
很多互聯(lián)網(wǎng)應(yīng)用程序都提供了全文搜索功能,用戶可以使用一個(gè)詞或者詞語片斷作為查詢項(xiàng)目來定位匹配的記錄。在后臺(tái),這些程序使用在一個(gè)SELECT查詢中
的LIKE語句來執(zhí)行這種查詢,盡管這種方法可行,但對(duì)于全文查找而言,這是一種效率極端低下的方法,尤其在處理大量數(shù)據(jù)的時(shí)候。 MySQL
針對(duì)這一問題提供了一種基于內(nèi)建的全文查找方式的解決方案。在此,開發(fā)者只需要簡單地標(biāo)記出需要全文查找的字段,然后使用特殊的MySQL方法在那些字段
運(yùn)行搜索,這不僅僅提高了性能和效率(因?yàn)镸ySQL對(duì)這些字段做了索引來優(yōu)化搜索),而且實(shí)現(xiàn)了更高質(zhì)量的搜索,因?yàn)镸ySQL使用自然語言來智能地對(duì)
結(jié)果評(píng)級(jí),以去掉不相關(guān)的項(xiàng)目。
2)到 3.23.23 時(shí),MySQL 開始支持全文索引和搜索。全文索引在 MySQL 中是一個(gè)
FULLTEXT 類型索引。FULLTEXT 索引用于 MyISAM 表,可以在 CREATE TABLE 時(shí)或之后使用 ALTER
TABLE 或 CREATE INDEX 在 CHAR、VARCHAR 或 TEXT 列上創(chuàng)建。對(duì)于大的數(shù)據(jù)庫,將數(shù)據(jù)裝載到一個(gè)沒有
FULLTEXT 索引的表中,然后再使用 ALTER TABLE (或 CREATE INDEX)
創(chuàng)建索引,這將是非常快的。將數(shù)據(jù)裝載到一個(gè)已經(jīng)有 FULLTEXT 索引的表中,將是非常慢的。 全文搜索通過 MATCH() 函數(shù)完成。
|
|
下面大概介紹一下創(chuàng)建全文索引的過程,主要有兩種辦法:
第一種是創(chuàng)建表的時(shí)候就創(chuàng)建全文索引,第二種類是在創(chuàng)建表以后再增加全文索引,通過上面的引文我們知道后者比前者有些好處
1、先創(chuàng)建表,然后通過"AlTER TABLE"增加全文索引
mysql> create database ftt; --創(chuàng)建數(shù)據(jù)庫 Query OK, 1 row affected (0.03 sec) mysql> use ftt; --使用數(shù)據(jù)庫 Database changed mysql> create table reviews --創(chuàng)建表 -> ( -> id int(5) primary key not null auto_increment, -> data text -> ); Query OK, 0 rows affected (0.09 sec)
mysql> INSERT ignore INTO `reviews` (`id`, `data`) VALUES(1, 'Gingerboy has a new singl e out called Throwing Rocks. It\'sgreat!'); --下面三句都是插入數(shù)據(jù) Query OK, 1 row affected (0.06 sec)
mysql> INSERT ignore INTO `reviews` (`id`, `data`) VALUES (2, 'Hello all, I really like the new Madonna single. One of the hottest tracks currently playing...I\'ve bee n listening to it all day'); Query OK, 1 row affected (0.00 sec)
mysql> INSERT ignore INTO `reviews` (`id`, `data`)VALUES (3, 'Have you heard the new ba nd Hotter Than Hell?They have five members and they burn their instruments when they play in concerts. These guys totally rock! Like, awesome, dude!'); Query OK, 1 row affected (0.00 sec)
mysql> alter table reviews add fulltext index (data); --通過alter增加全文索引 Query OK, 3 rows affected (0.16 sec) Records: 3 Duplicates: 0 Warnings: 0
mysql> select id from reviews where match (data) against ('Madonna'); --通過match和against實(shí)現(xiàn)全文檢索 +----+ | id | +----+ | 2 | +----+ 1 row in set (0.00 sec)
mysql> select id from reviews where match (data) against ('+Madonna+instruments' ); --搜索出包含Madonna或者instruments的所有記錄的id號(hào) +----+ | id | +----+ | 2 | | 3 | +----+ 2 rows in set (0.00 sec)
mysql> select id from reviews where match (data) against ('Mado*' in boolean mod e); --檢索出包含Mado的所有記錄的id +----+ | id | +----+ | 2 | +----+ 1 row in set (0.00 sec)
|
|
補(bǔ)充
從上面的結(jié)果不難看出,mysql的全文索引和檢索支持多關(guān)鍵字,從下面的參考資料,你還可以發(fā)現(xiàn)更多實(shí)現(xiàn),看看去哦
2、在創(chuàng)建表的時(shí)候就創(chuàng)建全文索引
由于其他的內(nèi)容和上面差不多,下面只給出創(chuàng)建時(shí)的語法
Code:
[Ctrl+A Select All]
參考資料:
1)如何在MySQL中獲得更好的全文搜索結(jié)果 http://dev.21tx.com/2006/04/05/10735.html
[主要介紹了全文檢索和搜索是怎么用的]
2)mysql全文檢索http://www.jolr.com/forum/?display=topic&id=4856&s=371cda7ed1694f669f75610dde769c82
[主要介紹了全文檢索的一些語法知識(shí)等]
另外,如果想要看最原始的資料,請上mysql官方網(wǎng)站,http://www.mysql.com
大家注意拉,mysql5以后才支持視圖和存儲(chǔ)過程
要是想要使用這些東西,可以到www.mysql.cn或者www.phpchina.cn下載mysql5.0.18哦
1)下面是mysql下存儲(chǔ)過程的使用
http://www.mimi163.net/cs/wenzhang/2006/3/16/996.htm
有時(shí)間寫篇關(guān)于mysql和其他數(shù)據(jù)庫存儲(chǔ)過程使用的比較,呵呵
感覺這個(gè)東西還是很有用的拉
2)另外,這里有一篇介紹php怎么調(diào)用mysql的存儲(chǔ)過程的
也是相當(dāng)?shù)牟诲e(cuò),呵呵
http://www.ithack.net/Articles/php/2005052595601.html
不過上面的東西,我還沒有測試過,正在使用中...
后面用了一下感覺不錯(cuò)
對(duì)拉,注意這個(gè)東西的意思哦
delimiter // --- 這是定義結(jié)束符為“//”
解決了mysql5中直接創(chuàng)建全文索引時(shí)的一個(gè)問題
問題為:
ERROR 1214 (HY000): The used table type doesn't support FULLTEXT indexes
解決:
http://www.dmresearch.net/shijun/?p=108
好東西,先放這里
《PHP 字符串操作入門教程 》
http://study.zhupao.com/infoview/Article_16867.html
我自己試了后精簡說一下:
問題:
ERROR 1214 (HY000): The used table type doesn't support FULLTEXT indexes
解決辦法:
如果你以前使用:
create table test
(
id int not null primary key,
name text,
fulltext(name)
);
出錯(cuò)
那么現(xiàn)在使用
create table test
(
id int not null primary key,
name text,
fulltext(name)
)type=myisam;
就可以解決
或者把type用engine代替
補(bǔ)充:
在我使用的時(shí)候
mysql4.0竟然沒有這個(gè)問題,但是使用mysql5.0的時(shí)候到出現(xiàn),不過用上面辦法就解決拉