mysql中文進行全文索引支援問題

2021-07-05 03:42:44 字數 3540 閱讀 2983

mysql 中的myisam儲存引擎的特性:

不支援事務,沒有行級鎖,當資料庫崩潰時,不可以安全恢復

加鎖併發

當讀取某個表的資料時,會給該錶加共享鎖,寫入時會加排他鎖,在查詢表的資料時可以併發插入新的記錄

索引特性  支援 text blog 型別的字段作為索引,基於前500個字元建立,也支援全文索引

延遲更新索引鍵   每次修改鍵索引資料並不會馬上寫入硬碟上,而是在記憶體中的鍵緩衝區,在清理快取區或關閉表時才寫入磁碟中,但是當資料庫崩潰時會造成索引的損失,需要執行修復操作

myisam壓縮表 就是當某個表建立時,並不需要進行修改則可以將表壓縮,這樣既節省了磁碟空間,又可以減少磁碟i/o 從而提公升了查詢的效能,壓縮表也支援索引,不過也是唯讀的。

innodb儲存引擎

特性

預設隔離級別為可重複讀,使用

mvcc

多版本併發控制,提高了併發性

使用間隙鎖來防止幻讀,不僅僅涉及到讀取的行,還會是用間隙鎖防止插入其他資料

是基於聚族索引建立的資料庫,對於主鍵的查詢很高的效能。二級索引

(非主鍵索引

)必須包含主鍵列,若主鍵列比較大時,其他索引列也會很大,所以主鍵列盡可能小

myism 支援全文索引:

給資料庫表新增乙個myisam資料庫引擎

alter table song engine=myisam

alter table song add fulltext index(songname)  

也可以對多個欄位加全文索引

alter table song add fulltext index(songname,songkind)

select * from song match(songname) against('zhou')

myisam:特點  設計簡單,資料以緊密格式儲存,最典型的效能問題是表鎖

先來看看對乙個欄位做全文索引,作為乙個資料庫系統需要做哪些工作?

假設乙個文章表裡面包含幾個字段:文章id、文章作者、文章標題、文章內容

這就像,如果我想去新華字典中查詢乙個漢字,我直接按照筆畫或者按照拼音來查詢(這個就是新華字典的索引),避免把新華字典從頭翻到尾部,這樣的效率多低。沒錯,如果沒有索引,資料庫系統就是需要這樣子遍歷掃瞄整個表才能得到資料的。

ps:機器其實是死的,你寫的**讓他做什麼就做什麼。而人有眼睛,可以通過眼睛來看,比如大體翻看一下新華字典,也許眼睛就看到我需要的漢字了呢。

資料庫系統中的關於那個索引結構大體可以這樣理解:

beijing    1,2,3…

索引就是方便快速查詢,根據這個索引結構,搜尋的時候就可以快速定位到資料位置了。

beijing  8,9,10

新加入的文件id為20,剛好其中文章內容被提取到了詞語beijing

那麼索引就要更新成如下形式:

beijing 8,9,20

這樣解釋是方便理解,理解就好。

大體是這樣子的模式。具體實現會跟這個存在差異的。把複雜的問題解釋得通俗化,簡單化是而容易理解,是我進行總結的目的。

ps:mysql的乙個表的所有欄位的索引資料都在一張乙個」表名稱.myi」檔案中。

理解了上面的實現原理,

現在也好理解一句話了,這是從mysql手冊中中的一句話:

對於較大的資料集,將你的資料輸入乙個沒有fulltext索引的表中,然後建立索引, 其速度比把資料輸入現有fulltext索引的速度更為快。

上面已經建立文章內容欄位為全文索引,現在mysql是怎麼進行全文查詢的呢?

select  id,title from 文章表 where match(article_content) against ('search keyword')

match()中指定欄位名稱。表示against()中出現的字串要去哪個欄位中匹配。這裡可以指定多個字段

against()中的字串,難道不是單個詞語,mysql會自動對受到的字串進行分詞嗎?

against ('+mysql -yoursql' in boolean mode);

+號表示,mysql這個單詞必須出現在每一行的開頭位置?

『』裡面是單詞,多個單詞之間需要使用空格分開嗎?

來看看對英文進行分詞有什麼天然優勢

英文的特點,每個英文單詞就是乙個詞語,單詞與單詞之間有非常明顯的分割符號—空格 比如

my  name is wangxiaoming

this city is beijing…..

總結一下

來看看,中文分詞為什麼就比較麻煩

計算機怎麼知道哪個算是詞語呢?比如輸入一串文字 」我來自北京,我很喜歡運動、聽**…,喜歡聽周華健的歌曲」

像我們常見的中文切詞,我了解到有幾種分詞演算法:

1、  就是根據詞庫來進行對比的。

2、  二元分詞法

3、  統計法

對比:二元分詞方法和統計方法是不依賴於詞典的,而最大匹配法分詞方法是依賴於詞典的,詞典的內容決定分詞結構的好壞。

現在總結一下:mysql不會斷中文字:mysql內建的字依據是空白、逗號和點來斷詞語。

mysql手冊中原文如下:

fulltext分析程式會通過尋找某些分隔符來確定單詞的起始位置和結束位置,例如' ' (間隔符號)、 , (逗號)以及 . (句號 )。假如單詞沒有被分隔符分開,(例如在中文裡 ),則 fulltext 分析程式不能確定乙個詞的起始位置和結束位置。為了能夠在這樣的語言中向fulltext 索引新增單詞或其它編入索引的術語,你必須對它們進行預處理,使其被一些諸如"之類的任意分隔符分隔開。

…………………

諸如漢語和日語這樣的表意語言沒有自定界符。因此, fulltext分析程式不能確定在這些或其它的這類語言中詞的起始和結束的位置。

其隱含操作及該問題的一些工作區在12.7節,「全文搜尋功能」有詳細論述。

******************************====結束

中文與西方文字如英文的乙個重要區別在於,西方文字以單詞為單位,單詞與單詞之間以空格分隔。而中文以字為單位,詞由乙個或多個字組成,詞與詞之間沒有空格分隔。當試圖在乙個含有中文字元的字段中使用全文搜尋時,不會得到正確的結果,原因在於中文中沒有像英文空格那樣對詞定界,不能以空格作為分割,(於是不方便)對中文詞語進行索引。

現在歸納一下,mysql不能很好地支援中文全文索引的解決辦法

1、針對對myql全文檢索解析器內建機制特點,白痴解決方法是,存中文字時自行塞入空白斷字。

這樣就適應了mysql的切詞機制了。不過這樣子做比較彆扭。因為哪有把」我是中國人」古意分開成」我 是 中國人」這樣的形式呢。

顯示文章內容的時候就比較彆扭,不能顯示成」我 是 中國人」給使用者看,需要需要自己再次處理。

2、使用切詞外掛程式。mysql應該是意識到單靠自己來提供分詞,永遠無法滿足世界上各種各樣語言的特殊需求。於是從5.1版本開始,mysql全文檢索的解析器以外掛程式的方式提供。讓大家可以以外掛程式的形式掛到mysql下面去(實際上就是作為mysql的乙個儲存引擎,比如sphinx就是外掛程式掛上去)

掛載到mysql中的外掛程式所完成是乙個什麼樣的角色呢?

使用外掛程式,就是可以按照你自己的方式去分詞

mysql全文索引的坑 MySQL全文索引問題

我有乙個包含以下資料的 文章 mysql select from articles id title body 1 mysql tutorial dbms stands for database 2 how to use mysql well after you went through a 3 o...

mysql全文索引中文搜尋

由於mysql的預設配置是索引的詞的長度是4,所以需要修改mysql的配置檔案my.cnf 在 mysqld 位置內加入 ft min word len 2 其它屬性還有 ft wordlist charset gbk ft wordlist file home mysql wordlist gbk...

mysql全文索引

了解 solr 之後 發現全文索引也能做檢索 故了解了下 筆記如下 建立全文索引 alter table table add fulltext index fulltext table 列1 列2 查詢方式 select from table where match 列1 列2 against 查詢...