mysql數(shù)據(jù)庫模糊查詢語句 分析為什么mysql中l(wèi)ike模糊查詢效率低?
分析為什么mysql中l(wèi)ike模糊查詢效率低?相比update和insert,一般查詢應(yīng)該是數(shù)據(jù)庫中操作最頻繁的。而在有些應(yīng)用場(chǎng)景需要用到like模糊查詢,那么對(duì)于大數(shù)據(jù),查詢的時(shí)候就要注意了?,F(xiàn)在來
分析為什么mysql中l(wèi)ike模糊查詢效率低?
相比update和insert,一般查詢應(yīng)該是數(shù)據(jù)庫中操作最頻繁的。而在有些應(yīng)用場(chǎng)景需要用到like模糊查詢,那么對(duì)于大數(shù)據(jù),查詢的時(shí)候就要注意了。
現(xiàn)在來分析一下為什么like語句查詢的效率會(huì)很低,測(cè)試數(shù)據(jù)共4000000條,如下圖:
第一步:不使用索引
下圖可以看出,不使用索引的時(shí)候普通查詢與like查詢的耗時(shí)相當(dāng),like略長(zhǎng),這也是必然的,因?yàn)樗M(jìn)行額外的算法。
第二步:使用索引
如下圖,使用索引后,普通查詢的耗時(shí)基本算是秒查,非??欤欢鴏ike查詢還是耗時(shí)一秒多。
第三步:分析原因
如下圖,用explain分析一下,此時(shí)我們立刻明白了,普通查詢用到了索引,但是like語句沒有用到索引。
所以,照成mysql中l(wèi)ike查詢效率低下的原因是:在有些情況下,like查詢使用不到索引,會(huì)掃描全表。
最后,補(bǔ)充一下,like語句有時(shí)候也是可以用到索引的,如下圖,如果我們查詢的時(shí)候?qū)懗伞發(fā)ike "dd_"或者like "dd%"”,這樣是可以用到索引的,此時(shí)的查詢速度也會(huì)相對(duì)的快一點(diǎn)。雖然快了一點(diǎn),但是還是比普通查詢耗時(shí)要多很多。
因此,當(dāng)表的數(shù)據(jù)量比較大的時(shí)候,盡量還是不要用like語句了。如果想做模糊搜索,建議用搜索引擎,比如solr,這樣會(huì)比like強(qiáng)大n倍。
MySQL模糊查詢like和ilike的區(qū)別?
LIKE 和 ILIKE 操作符可以模糊匹配字符串,LIKE是一般用法,ILIKE匹配時(shí)則不區(qū)分字符串的大小寫,~ 波浪號(hào)則可以使用正則匹配。
LIKE和 ILIKE
它們需要結(jié)合通配符使用,下面介紹兩種常用的通配符。
%:百分號(hào)用于匹配字符串序列,可匹配任意組合;
_:下劃線用于匹配任何單一字符。
則可以使用正則模式來匹配字符串,除此之外它匹配模式還有一個(gè)特殊的地方
select * from table where ~ "ab" --> 如果是這樣的形式就代表著他可以匹配任何包含ab的字符串其實(shí)就相當(dāng)于省略的兩邊的 .*
如果想要做前綴匹配或后綴匹配,可以用下面的方法
1、前綴 模糊查詢。
select * from table where ~ "^ab"
2、后綴 模糊查詢。
select * from table where ~ "ab$"
MySqllike模糊查詢通配符使用詳細(xì)介紹?
1、常見用法:
(1)搭配%使用
%代表一個(gè)或多個(gè)字符的通配符,譬如查詢字段name中以大開頭的數(shù)據(jù):
(2)搭配_使用
_代表僅僅一個(gè)字符的通配符,把上面那條查詢語句中的%改為_,會(huì)發(fā)現(xiàn)只能查詢出一條數(shù)據(jù)。
2、使用like模糊查詢會(huì)導(dǎo)致索引失效,在數(shù)據(jù)量大的時(shí)候會(huì)有性能問題
(1)盡量少以%或者_(dá)開頭進(jìn)行模糊查詢
通過explain執(zhí)行計(jì)劃,我們發(fā)現(xiàn),使用like模糊查詢時(shí),如果不以%和_開頭查詢的話,索引還是有效的。
(2)使用覆蓋索引
當(dāng)查詢的的條件和查詢的結(jié)果都是索引中的字段的時(shí)候,這個(gè)索引我們可以稱之為覆蓋索引,這個(gè)時(shí)候,使用like模糊查詢索引是有效的。
InnoDB中主鍵可以不添加進(jìn)索引中
注意:使用覆蓋索引,對(duì)于字段的長(zhǎng)度是由要求限制的,一般超過長(zhǎng)度,索引也會(huì)失效
這里如果查詢中帶有descripition字段,則覆蓋索引也會(huì)失效。
擴(kuò)展資料