2012-01-21 178 views
1

關於如何優化MySQL查詢中的連接的任何輸入?例如,考慮以下查詢如何優化多個連接的MySQL查詢?

SELECT E.name, A.id1, B.id2, C.id3, D.id4, E.string_comment 
    FROM E 
    JOIN A ON E.name = A.name AND E.string_comment = A.string_comment 
    JOIN B ON E.name = B.name AND E.string_comment = B.string_comment 
    JOIN C ON E.name = C.name AND E.string_comment = C.string_comment 
    JOIN D ON E.name = D.name AND E.string_comment = D.string_comment 

表A,B,C,d是臨時表,並含有1096行和表E(也臨時表)包含426行。在不創建任何索引的情況下,MySQL EXPLAIN向我顯示了從所有表中搜索的所有行。現在,我在所有表A,B,C,B和E上爲名稱創建了名爲name_idx和string_comment的FULLTEXT索引作爲string_idx。EXPLAIN命令仍然給出瞭如下所示的相同結果。 另外,請注意, 名稱和string_comment VARCHAR類型和IDX的都是int類型(15)

id select_type table type possible_keys   key key_len ref rows Extra 
    1 SIMPLE  A  ALL name_idx,string_idx      1096 
    1 SIMPLE  B  ALL name_idx,string_idx      1096 Using where 
    1 SIMPLE  C  ALL name_idx,string_idx      1096 Using where 
    1 SIMPLE  D  ALL name_idx,string_idx      1096 Using where 
    1 SIMPLE  E  ALL name_idx,string_idx      426 Using where 

我如何能調整任何評論此查詢?

謝謝。

回答

1

對於每個表,您應該在兩列上創建一個複合索引。語法有點不同,但它是這樣的:

CREATE INDEX comp_E_idx E(name, string_comment) 

並重復所有表。 單獨的索引不會幫助,因爲當它試圖合併時,它們是無用的。它在索引中搜索名字的速度非常快,但必須迭代才能找到評論

+0

您還應該調用ANALYZE TABLE這將進一步幫助調整查詢。 –

0

您在問是否可以調整查詢。我首先會問,數據本身是否可以調整。即請考慮將A,B,C,D和E中的數據放入具有NULL列的單個表中。這將減少搜索從O(N^5)到O(N)的複雜性。