2012-06-20 49 views
0

首先,我不得不說這個話題是非常普遍的話題。我已經研究過所有相關的主題,但我找不到答案。 我有三張桌子。消息表有300.000,標記表有100萬,message_tag表有大約1000萬行。 message_tag.message_id和message_tag.tag_id列具有索引。我的目的是選擇鏈接一個spesified標籤的消息。但查詢時間太長。沒有任何查詢時間少於20秒。另一方面,由於查詢時間過長,有時查詢甚至不會給出結果。表結構和我的查詢如下。我該如何處理這個問題?我打開所有建議。即使我可以用新的模式重新創建表格。數據庫是MySql,存儲電機是MyIsam。 。MySQL中的查詢優化

table name: messages 
columns : 
id (int) 
message (vharchar) 
message_poster (vharchar) 

table name: tags 
id (int) 
tag (vharchar) 

table name : message_tag 
columns : 
message_id (int) 
tag_id (int) 

我的查詢:

SELECT     messages.message_poster, 
          messages.message 
        FROM tags, messages, message_tag 
        WHERE message_tag.tag_id=191 
        AND messages.id= message_tag.message_id 
+0

您已閱讀所有相關主題,但您是否找到關於「索引」的任何內容?如果你能告訴我們你有什麼指數(指數?),請這樣做。如果你不能,找出它們是什麼,以及如何應用它們:D – Nanne

+1

請提供'SHOW CREATE TABLE messages','SHOW CREATE TABLE tags'和'SHOW CREATE TABLE message_tag'的輸出。 – RandomSeed

+0

你好嗎?使用'標籤'表?它在你的列表中,但不在你的「select」或「where」子句中。 –

回答

2

這裏是我不喜歡使用,表示法的一個例子。

你不涉及message_tagtags。相反,您加入每個消息標籤到其他行。

這是你有什麼...

SELECT 
    messages.message_poster, 
    messages.message 
FROM 
    messages 
INNER JOIN 
    message_tag 
    ON messages.id= message_tag.message_id 
CROSS JOIN 
    tags 
WHERE 
    message_tag.tag_id=191 

這就是你應該有...

SELECT 
    messages.message_poster, 
    messages.message 
FROM 
    messages 
INNER JOIN 
    message_tag 
    ON messages.id = message_tag.message_id 
INNER JOIN 
    tags 
    ON tags.id  = message_tag.tag_id 
WHERE 
    message_tag.tag_id = 191 

(或者,只是不上tags JOIN在這種情況下,你並沒有使用它,儘管我明白這可能是實際查詢的簡化版本。)

ANSI-92表示法很難將其搞亂。

+0

+1用於重寫整個查詢:p –

0

創建於中Message_Tag二維指數(在這兩個領域),而WHERE改寫爲

WHERE 
    message_tag.tag_id=191 AND 
    message_tag.message_id = messages.id 
0

我想你錯過了加入2個表格之間的條件,也許tagsmessage_tag