2012-03-28 162 views
0

假設表條件加入 ID,A_ID,B_ID,C_ID,D_ID,金額,一年,main_colmysql的多對多表查詢性能

一個(500行): ID,a_col1,a_col2

b(2000行): ID,b_col1,b_col2,b_col3

C(500行): ID,c_col1,c_col2

d(1000行): ID,d_​​col1,d_col2

而且我們有這樣的查詢:

select sum(amounts), main_col 
    join a on a.id = main.a_id 
    join b on b.id = main.b_id 
    join c on c.id = main.c_id 
    join d on d.id = main.d_id 
    where a.a_col1 in (...) 
    and a.a_col2 in (..) 
    and b.b_col1 in (...) 
    and b.b_col2 in (...) 
    and b.b_col3 in (..) 
    and c.c_col1 in (..) 
    and c.c_col2 in (..) 
    and d.d_col1 in (..) 
    and d.d_col2 in (..) 
    and year = 2011 

    group by main.main_col 

任何想法誰對主表創建索引來提高查詢性能?

感謝

更新: 指標加入到A,B,C,對於列d表中的主表,其中 我試過多列索引顯示(A_ID,B_ID,C_ID,D_ID ,main_col),其性能最佳,比如在a_id,b_id ...上添加單獨索引,但對於需求來說仍然不夠快,查詢需要7秒鐘才能運行以適應最大情況

+0

如果您真的在努力優化查詢並嘗試了一切,那麼您可能需要查看您的模式。有可能去規範/創建聚合表等來提高性能。 – liquorvicar 2012-03-28 08:23:48

回答

1

CREATE INDEX id_main ON主(ID)

您可以創建多個索引添加最後一欄,看看它是如何爲你工作的。

http://dev.mysql.com/doc/refman/5.0/en/create-index.html

+0

默認情況下添加主鍵(id)索引,我試圖爲主表上的外鍵添加多個索引,並使用explain來檢查sql並且mysql沒有選擇查詢的索引 – 2012-03-28 07:57:14

+0

好的。你沒有說明你的表上有主鍵,我不想假設你做了,而只是如何應用索引。 MySQL引擎會根據它認爲最好的方式選擇一個索引/執行路徑。您可以閱讀這篇關於如何調整查詢性能的文章:http://www.databasejournal.com/features/mysql/article.php/1382791/Optimizing-MySQL-Queries-and-Indexes.htm – 2012-03-28 08:03:38

0

由於主鍵已經默認了索引,連接無法通過添加更多的索引優化。所以這就留下了你的陳述。所以它可以幫助將索引添加到x.x_colN列。

0

你也應該有你的GROUP_BY指數我覺得

1

這要看具體情況怎麼樣選擇每個連接的,每個表有多大等。一般,可能是明智的,添加一個或多個您的主表的外鍵索引,但誰可以從有限的信息說?

它也可能有助於瞭解您的查詢如何執行 - 嘗試查看MySQL的「解釋」或「解釋擴展」。