mysql如何優化like %關鍵字 查詢?
02-02
在不使用lucene、Sphinx、solr等專門的全文檢索開源工具和全文索引的情況下,如何優化mysql中的like %關鍵字
一般公司部門已經規定禁止Mysql sql 語句使用like 關鍵字
全文索引不能滿足你要求的話,是不是這個需求本身可以被其它方式改造?如果實在不能,你這是一個後綴的索引要求,MySQL支持前綴索引,但是不支持後綴索引,從MySQL5.7後支持表達式索引了,如果你要filter的列是不變的,並且後綴的長度是固定的,就可以為這一列建一個後綴的substr的表達式索引,應該可以滿足你的要求。
---------
細化一下我的描述,昨天用的手機回答的你的需求是要匹配後綴,但是後綴一般是沒有優化的,所以應該把後綴裁剪出來,和Andy Young描述有一點比較一致,然後對後綴進行反轉,然後對該生成列建索引,oracle對這種索引叫表達式索引,MySQL5.7成為生成列索引用例:假如對最長長度為100的字元串列的字元串後10個字元建索引
create table t1(a int, b varchar(100), c varchar(10) as (reverse(substr(b, length(b)-10))));create index i1 on t1(c);查詢:select * from t1 where c like reverse(%關鍵字);這樣優化器會選擇走生成列的索引。。。
新增一列,存儲該欄位的反轉。比如原欄位是abcd,取反存儲為dcba,查詢%bcd改成查dcb%。僅供參考。
mysql基本都被他們研發團隊重寫了,著重優化了鎖好多機制,處理並發能力提升了好多!原版mysql的鎖他們都是棄用的,根本適應不了現實的生產環境!好好學習吧!
為何不考慮其他方式實現呢,
可以使用SQL模式匹配啊,MySQL提供標準的SQL模式匹配,以及一種基於象Unix實用程序如vi、grep和sed的擴展正則表達式模式匹配的格式。
參考自:MySQL模式匹配詳解 One Flower Is A World
也可以使用原生JSON格式來進行存儲,原生的JSON格式查詢不需要遍歷所有字元串才能找到數據,支持索引,而且可以做到JSON數據有效性檢查。
參考自: MySQL 5.7原生JSON格式支持推薦閱讀:
※MySQL 和 PostgreSQL 相比,對 JSON 的支持如何?
※1.3 Mysql 安裝與使用-基礎配置-NodeJs+Express+Mysql實戰
※mysql pid文件是什麼用途?
TAG:MySQL |