MySQL FullText索引 實踐。

2021-10-10 08:40:29 字數 1285 閱讀 5074

首先mysql5.7版本開始提供了對 fulltext 全文索引的支援,全文索引其實就是對模糊 查詢及跨列查詢的乙個優化方案

比如我們有乙個資訊表 z 我們要查詢 資訊表中a列含「xx」字元和b列含有「xx」字元的所有行 我們通常是這樣:select * from z where a like 『%xx%』 and b like』%xx%』;

這樣一條sql一句 效能是相當低下的 而且 不能命中索引,資料量龐大的話根本沒得玩。所以mysql5.7版本開始對這方面的需求提出了優化方案,即引入fulltext 全文索引的支援。

用法:

建立一張測試表

create table index_test

(id int primary key auto_increment,

fullname varchar(255),

title varchar(255),

body varchar(3000)

-- fulltext(title, body)`d_test``d_test`

);給表新增索引:

-- 建立全文索引

create fulltext index fullname_title_index on index_test(fullname,title);

-- 查詢fullname,title欄位以 「j」開頭的所有記錄

select * from `index_test` where match(fullname,title) against('j*' in boolean mode);

在語法上其實fulltext和我們傳統的查詢還是有很多區別的

語法如下:

'資料庫 管理'     包含'資料庫'或包含'管理'的資料

'"資料庫 管理"' 不會因為空格而分隔,搜尋包含'資料庫 管理'的資料

'+資料庫 +管理' 同時包含'資料庫'和'管理'的資料

'+資料庫 -管理' 包含'資料庫'但沒有'管理'的資料

'+資料庫 管理' 包含'資料庫'的資料,有'管理'的資料優先顯示

'+資料庫 >管理' 包含'資料庫'的資料,有'管理'的資料優先顯示

'+資料庫 《管理' 包含'資料庫'的資料,有'管理'的資料優先顯示,但排位低於'>'的資料

如果需求設計到分詞的話,其實我們可以直接寫一套方案用於分詞,然後結合fulltext做乙個分詞查詢 就像現在的 es框架結合ik分詞器那樣,如果全文搜尋 的場景不是特別多或者無法引入es框架 那完全可以按這個 思路直接實現一套分詞邏輯然後配合fulltext使用。

mysql FullText全文索引的問題

今天有同學問題,搜尋ip的時候怎樣能把 select ip from tabelx where ip like 192.168.0.1 這種句子的效能優化。的確,使用 like x 的方式,資料庫沒辦法使用索引,一定會進行整表掃瞄,所以我們需要避免這種方法。之前同事叫我嘗試一下用 match aga...

索引,復合索引

這裡只看btree索引,至於雜湊索引和全文索引本文暫不討論。前言 索引是有效使用資料庫的基礎,但你的資料量很小的時候,或許通過掃瞄整表來訪問資料的效能還能接受,但當資料量極大時,當訪問量極大時,就一定需要通過索引的輔助才能有效地訪問資料。一般索引建立的好壞是效能好壞的成功關鍵。使用innodb作為資...

正向索引 反向索引 B Tree索引

索引就是為了更快的找出需要的資訊。一般都要進行排序。正向索引 開發出來用來儲存每個文件的單詞的列表。實際上,時間 記憶體 處理器等等資源的限制,技術上正向索引是不能實現的。既 儲存乙個文件中有那些單詞。有多少單詞就有多少列。然後對每一列進行某種排序。反向索引 其中每條記錄,記錄的是乙個單詞都在那些文...