%xxx%這種方式對於數據量少的時候,咱們倒能夠隨意用,可是數據量大的時候,咱們就體驗到了查詢性能的問題,像老化的車子艱難趴着坡同樣,而且這種方式並未使用到索引,而是全表掃描mysql
mysql 高效模糊查詢 代替likesql
而對於xxx% 或者%xxx方式,explain一下能夠發現查詢使用到了索引,性能提高了很多,固然這種方式不適用與全部的查詢場景。
能夠採起如下的函數進行查詢。
LOCATE('substr',str,pos)方法 POSITION('substr' IN field)方法 INSTR(str,'substr')方法
查詢效率好比果:table.field like '%AAA%' 能夠改成locate ('AAA' , table.field) > 0函數
返回子串substr在字符串str第一個出現的位置,若是substr不是在str裏面,返回0.
mysql> select LOCATE('bar', 'foobarbar'); -> 4 mysql> select LOCATE('xbar', 'foobar'); -> 0性能
該函數是多字節可靠的。spa
返回子串substr在字符串str第一個出現的位置,從位置pos開始。若是substr不是在str裏面,返回0。
mysql> select LOCATE('bar', 'foobarbar',5); -> 7code
mysql like模糊查詢提升效率的奇葩方法blog
一張表大概40萬左右的數據,用like模糊查詢title字段,很慢,title字段已經創建了索引,mysql 對 someTitle% 這樣的模糊查詢在有索引的前提下是很快的。
因此下面這兩臺sql語句差異就很大了
$sql1 = "...... title like someTitle%" (話費0.001秒)
$sql2 = "...... title like %someTitle%" (話費0.8秒)
這兩句的效率相差了800倍,這很可觀啊。
因此我有個想法:在不用分詞的方法的前提下,把存儲的title字段,加一個特別的前綴,好比"im_prefix",好比一條記錄的title="我是標題黨",那麼存儲的時候就存儲爲"im_prefix我是標題黨"。
這樣一來,咱們要模糊查找"標題黨"這個關鍵詞的時候,就把sql寫成這樣:
$sql1 = "...... title like im_prefix%標題黨%" (花費0.001秒),前臺顯示數據的時候,天然把取到的title過濾掉"im_prefix"這個前綴了
索引