2011-05-24 123 views
1

我正在將文本文件加載到我的數據庫中,並嘗試在列出組織名稱的表和包含文本文件以及與這些組織的潛在匹配項的表之間進行快速匹配。在MySQL查詢中使用Like和Concat

我使用LOAD INFILE CONCURRENT加載文件,並沒有任何問題。

扭曲來自於我試圖在原始文本表(occupationoraffiliation)中匹配的字段不僅僅是組織名稱。所以我試圖用通配符LIKE來匹配字符串。

匹配的文本,我想用這個查詢:

UPDATE raw_faca JOIN orgs AS o 
    ON raw_faca.org_id IS NULL AND raw_faca.occupationoraffiliation LIKE CONCAT('%',o.org_name,'%') 
SET raw_faca.org_id = o.org_id; 

我也試過不CONCAT

UPDATE raw_faca JOIN orgs AS o 
    ON raw_faca.org_id IS NULL AND raw_faca.occupationoraffiliation LIKE ('%' + o.org_name + '%') 
SET raw_faca.org_id = o.org_id; 

raw_faca表有〜40000行和orgs表有約20,000行。我有所有的索引查詢已經運行了幾個小時左右 - 這對於操作來說似乎太長了。我試圖運行效率低下的比較還是我在這裏做了一些非常愚蠢的事情?我希望避免使用外部的php或python腳本逐行。

在回答下面的評論有關使用Match . . . Against,我試過下面的查詢,以及:

UPDATE raw_faca JOIN orgs AS o ON raw_faca.org_id IS NULL AND MATCH(raw_faca.occupationoraffiliation) AGAINST (o.org_name IN NATURAL LANGUAGE MODE) 
SET raw_faca.org_id = o.org_id; 

而且它給我這個錯誤:

incorrect arguments to AGAINST 

有什麼想法?

回答

3

帶有前導通配符的LIKE子句不能利用任何索引。

+1

換句話說,@tchaymore,你的查詢必須檢查'40k * 20k = 800M'的組合,這就解釋了爲什麼它很慢。 – 2011-05-24 20:01:32

+0

明白了 - 我一直在使用外部腳本,它們面臨着基本相同的問題。關於如何在字段中進行匹配的任何想法,就像我在這裏試圖做的那樣,可以利用索引? – tchaymore 2011-05-24 20:09:15

+0

@tchaymore:如果這是一個MyISAM表,您可以考慮設置一個[全文索引](http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html)。 – 2011-05-24 20:12:28