mysql模糊查詢結果取反問題
mysql模糊查詢結果取反
問題描述
1、表結構:
2、只要包含3這種類型的都不能查詢。
解決方式
1、模糊查詢出所有包含3這種類型的數(shù)據(jù),在使用not in這種方式:
SELECT * FROM system_account WHERE id NOT IN (SELECT id FROM system_account WHERE identity_type LIKE "%3%");
這種方式如果類型中有13、23這種帶3的類型就需要修改模糊條件。
2、使用正則匹配方式:
SELECT * FROM `system_account` WHERE identity_type REGEXP "^([1,2,4,5,6,7,8,9]{1}\,?)*[1,2,4,5,6,7,8,9]{1}$";
這種方式只要在這種中排除3這種類型就可以了,但是沒添加一種類型就需要修改一次sql語句。
同事問的這個問題,第一反應是模糊查詢取反,所以感覺很有意思就記錄一下。
最終這種方案也沒有用上,同事把需求弄反了。
模糊查詢可以使用 not like 這種查詢方式 平時從來沒有用過也沒看見過 所以沒想到這種方法
SELECT * FROM admin_produce_order WHERE product_code LIKE 'CP211%' AND po_come_factory NOT LIKE "%羅西%"
mysql模糊匹配后匹配優(yōu)化
線上存在業(yè)務代碼,需要模糊匹配且進行后匹配
select * from test where id like "%1231"
優(yōu)化過程
mysql的后模糊匹配是不走索引的,所以數(shù)量級增大后,sql執(zhí)行速度會越來越慢,但是業(yè)務一定要保留該功能,且頻繁調用;
處理方案:
1. 使用表中已存在的其他列索引
如果查詢的表存在其他列索引,可以直接使用模糊匹配查詢完整的主鍵信息,再進行業(yè)務查詢
select id from test where id like "%1231" select * from test where id = #{id}
該方案簡單迅速,查詢索引級別一般可以達到index
2. 使用緩存記錄模糊匹配列所有數(shù)據(jù)
先進行緩存記錄所有模糊列數(shù)據(jù),再經過緩存進行數(shù)據(jù)匹配,最后進行業(yè)務查詢。
該方案需要保證緩存可靠,并且及時更新
3. 數(shù)據(jù)庫增加相反列,并設置對應索引
例如,原模糊列為id,值為123,相反列起名id_reverse,值則為321
當進行模糊匹配時,先對傳入?yún)?shù)進行卻反,123取反為321,最后用相反列進行匹配
select * from test where id_reverse like "321%"
如果需要保證該條件同時滿足前匹配和后匹配
select * from test where id like "123%" or id_reverse like "321%"
該方案需要保證相反列和模糊列數(shù)據(jù)保持相反,并同步更新,索引級別可達range
type索引類型:
ststem > const > eq_ref > ref > range > index > all
優(yōu)化級別從左往右遞減,沒有索引的一般為’all’,需要對type進行優(yōu)化前提是有索引。
其中’system’和’const’只是理想型,實際只能達到’ref’和’range’。
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
詳解MySQL數(shù)據(jù)類型DECIMAL(N,M)中N和M分別表示的含義
關于MySQL數(shù)據(jù)類型decimal中n和m分別表示什么含義?本文就此問題作了簡單論述,并創(chuàng)建相關表進行驗證,需要的朋友可以了解下。2017-10-10MySQL存儲過程輸入?yún)?shù)(in),輸出參數(shù)(out),輸入輸出參數(shù)(inout)
這篇文章主要介紹了MySQL存儲過程輸入?yún)?shù)(in),輸出參數(shù)(out),輸入輸出參數(shù)(inout),存儲過程就是一組SQL語句集,功能強大,可以實現(xiàn)一些比較復雜的邏輯功能,類似于JAVA語言中的方法;Python里面的函數(shù)2022-07-07MySQL刪除表數(shù)據(jù)與MySQL清空表命令的3種方法淺析
刪除現(xiàn)有MySQL表非常容易,但是刪除任何現(xiàn)有的表時要非常小心,因為刪除表后丟失的數(shù)據(jù)將無法恢復,下面這篇文章主要給大家介紹了關于MySQL刪除表數(shù)據(jù)與MySQL清空表命令的3種方法的相關資料,需要的朋友可以參考下2022-08-08JMeter對MySQL數(shù)據(jù)庫進行壓力測試的實現(xiàn)步驟
本文主要介紹了JMeter對MySQL數(shù)據(jù)庫進行壓力測試的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-01-01Mysql存儲引擎InnoDB和Myisam的六大區(qū)別
這篇文章主要介紹了Mysql存儲引擎InnoDB和Myisam的六大區(qū)別,本文從構成上、事務處理、SQL操作、自動ID、表行數(shù)等方面講解了它的區(qū)別,需要的朋友可以參考下2015-02-02