2014-05-20 138 views
0

2代表我有兩個MySQL表:"list""more"MySQL的加入基於文本字段

「列表」表有向上10萬條。

「更多」表有超過50,000個結果。

來自這些表的數據不能組合。

問題是,我在這兩個表中都有一個名爲「short_title」的列。它們都是VARCHAR(255),並且會包含一個像「short-title-here」這樣的字符串。

我用一個簡單的查詢,如:

SELECT L.title, M.more_info 
FROM `list` L, `more` M 
WHERE M.short_title = L.short_title 

由於在每個表這麼多的成果,我需要基於「short_title」列這是一個文本字段中的匹配結果它使查詢極其緩慢。

有關於在"list""short_title"列的索引,並在我的"more""short_title"列是唯一

有什麼我可以做的到列(例如:使它們全文),這將使這些查詢更快?

預先感謝您

**** ****更新

我已經改變了我的查詢INNER JOIN兩個表。

的解釋查詢的結果可以在這裏找到:

Results of the Explain Query

+0

由於您正在比較列的相等性,我不認爲您需要全文功能......只要確保在兩個表的short_title列上都有一個索引即可。 – Frazz

+0

謝謝,但我在列表中的''short_title''列已經包含一個INDEX,並且''more''表中的''short_title''列被設置爲UNIQUE - 如果我添加一個指數,phpMyAdmin提醒我,我不應該在同一列有兩個INDEXes – user1298740

+0

你確定索引統計數據是否更新?如果不是,引擎可能無法正確使用您的索引。查詢執行需要多長時間?你有解釋計劃來向我們展示嗎?只是要檢查正在使用的索引。另外...你是否嘗試了INNER JOIN語法而不是舊的多元WHERE語法? – Frazz

回答

0

嘗試索引short_title領域。

+0

「short_title」列已編入索引。在我的「list」表中,它們是INDEX,在我的「more」表中,它們是UNIQUE – user1298740

0

這是您的查詢(使用明確的書面聯接):

SELECT L.title, M.more_info 
FROM list L join 
    more M 
    on M.short_title = L.short_title; 

幽州short_title被存儲爲text。您可以通過在其上創建一個常規的索引:

create index more_short_title on more(short_title(255)); 

255是被索引的字節數。這應該加快查詢速度。

此外,爲了像short_title這樣的名稱,爲什麼不只是使用varchar()列而不是text

+0

謝謝你的迴應,但我應該澄清一點。 我的「short_title」列是包含文本的文本字段。它們實際上是VARCHAR(255) – user1298740

+0

@ user1298740。 。 。然後建立沒有'255'長度選項的索引。 –

+0

該指數已經存在,沒有長度選項 – user1298740