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