2013-02-08 80 views
3

嗨,我是擔心如何實現一個簡單的搜索查詢,我的方案是:MySQL的LIKE操作Vs的對陣

tag VARCHAR 255 

現在我需要標記字段內搜索,我可以使用兩種類型的查詢:

SELECT * FROM table WHERE tag LIKE '%1111%' OR LIKE '%2222%' OR LIKE '%3333%'; 

SELECT * ,MATCH(tag) AGAINST('+1111','+2222','+3333' IN BOOLEAN MODE) as score FROM table ORDER BY score DESC ; 

其更accurated /精確和更快?

感謝

+3

警告:對陣不會少於4個工作字符默認 – simplyray 2013-02-08 15:56:58

+0

是的,我只知道一個例子;) – sbaaaang 2013-02-08 15:57:12

回答

14

你的搜索是不等價的。 LIKE %1%將找到包含1的任何內容,例如, 1009110.1。這只是一個普通的子串匹配。 MATCH ('+1')理論上可行,但默認情況下FULLTEXT會忽略任何長度爲4個字符的「字」<。但是,假設您放寬全文限制,+1將找到任何獨立的1,但不會嵌入任何其他單詞。爲此,你需要+*1*

+0

該死的你總結了10行所有我需要知道的謝謝:),我會盡快接受.. – sbaaaang 2013-02-08 15:58:05

0

不要使用%1% 這將導致全表掃描,並且如果數據增長將會非常低效。

當在字符串值中進行搜索時,整個文本在更大的數據集中通常會更快。像運營商一樣使用它像'text%'

+0

-1對不起,但你應該檢查更好的答案-1我只是使用一個例子,再加上我已經編輯過 – sbaaaang 2013-02-08 17:07:38

7

最快的解決方案是爲標籤創建一個正確的標準化表,以便每個標籤都存儲在一個單獨的行上。

CREATE TABLE tags (
    tag VARCHAR(4), 
    tableid INT, 
    PRIMARY KEY (tag, tableid), 
    KEY (tableid, tag) 
); 

SELECT * FROM `table` JOIN tags ON table.tableid = tags.tableid 
WHERE tags.tag IN ('1111', '2222', '3333'); 

優點:

  • 無需擔心全文索引,ft_min_length,支持InnoDB等
  • 無需擔心串匹配與LIKE性能不良。
  • table中查找給定標籤及其匹配項使用主鍵索引。
  • table中查找給定條目的標記組使用輔助鍵索引。
  • 您對table中每件商品的標籤數量沒有限制。
  • 您可以輕鬆地計算某些標籤的頻率,就可以獲取組不同的標籤,你可以約束標籤對一個查找表等