在最近的一個項目須要實如今單表中對多字段進行多個關鍵字的模糊查詢,但這數個關鍵字並不必定都存在於某個字段mysql
例如現有table表,其中有title,tag,description三個字段,分別記錄一條資料的標題,標籤和介紹。而後根據用戶輸入的查詢請求,將輸入的字串經過空格分割爲多個關鍵字,再在這三個字段中查詢包含這些關鍵字的記錄。sql
可目前遇到的問題是,這些關鍵字是可能存在於三個字段中的任意一個或者多個,但又要求三個字段必須包含全部的關鍵詞。若是分別對每一個字段進行模糊匹配,是無法實現所需的要求,由此想到兩種方法:數據庫
在插入記錄的同時,將須要進行多字段模糊查詢的字段合併成一個字串並加入到一個新的字段中,而後對這個新字段進行模糊查詢。索引
使用全文檢索,可是這須要用到中文分詞或者將漢字轉化爲拼音(拆分漢字是不可行的,MySQL默認FT最小字節爲4),並且並不利於從此的維護。ip
在網上爬了兩天,對此問題的處理都沒有找到滿意的解決方法,最後在《MySQL權威指南》中翻到了CONCAT的使用方法,在書中的對CONCAT的描述是:字符串
CONCAT(str1,str2,…)
返回值:由全體出入參數合併在一塊兒而獲得的字符串。只要輸入的參數中有NULL值,就返回NULL。CONCAT容許只有一個輸入參數的狀況。it
所以,前文的查詢能夠經過下面這個SQL查詢實現
SELECT * FROM `magazine` WHERE CONCAT(`title`,`tag`,`description`) LIKE ‘%關鍵字%’io
在最近的一個項目須要實如今單表中對多字段進行多個關鍵字的模糊查詢,但這數個關鍵字並不必定都存在於某個字段,查了一下有點收穫
select * from table where `字段`='值' and concat(`title`,`content`) like '%關鍵字%'table
今天有朋友問select
引用原文:
請教一個問題:
我在mysql中建一個表,三百多萬條記錄,大約200mb大小,簡單的模糊查詢就很慢,請問有什麼解決辦法嗎??也許 col_XX 會達到20個左右.
他的SQL以下:
1 select * from table_XX where col_1 like '%條件%' or col_2 like '%條件%' or col_3 like '%條件%'or col_4 like '%條件%'
首先,須要說明的是,以上的SQL語句,在任何類型的數據庫上執行都不會使用到索引,意味着逐行掃描。
數據庫只能作如下:
在建好聯合索引 col_1,col_2.....後,
1 select * from table_XX where col_1 like '條件%' or col_2 like '條件%' or col_3 like '條件%'or col_4 like '條件%'
在必須以col_1做爲where第一個條件的前提下,以上條件能使用到索引,也就是說最前面不能用%,只能以「條件」開頭.
若是必定要實現 like '%條件%' ,數據庫沒法作到。
如下是實現的可選方案:
使用Lucene對須要檢索的字段作全文檢索(再加入本身的分詞組件)。經過Lucene進行搜索(搜索效果要比數據庫好得多),而非數據庫。