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