2011-07-01 54 views
0

我有一個查詢,其中有多個表使用distincct - 左連接 - order by - limit子句連接。MySQL查詢優化與表的數量加入和按限制條款排序

查詢看起來是這樣的: -

Select DISTINCT a.col1, b.col2, c.col3, d.col4, e.col5, f.col6, g.col7, h.col8, 
i.col9, j.col10 
From test_a a 
left join test_b b on a.col1 = b.col2 
left join test_c c on c.col1 = d.col2 
left join test_d d on d.col1 = c.col2 
left join test_e e on e.col1 = d.col2 
left join test_f f on f.col1 = e.col2 
left join test_g g on g.col1 = f.col2 
left join test_h h on h.col1 = a.col1 
left join test_i i on i.col1 = f.col2 
left join test_j j on j.col1 = i.col2 
Where a.col2 = 'Y' 
and c.col4 = 1 
Order by h.col5 desc 
limit 50; 

所有列中使用的在coditions有指標就可以了。並解釋這個查詢的輸出結果集,在那裏我可以看到它使用所有索引正確,它從所有表中掃描的總行數是18000.

我在這個查詢中想知道的是: - 這個查詢運行在幾秒鐘內我運行它沒有條款的順序。像這樣: -

Select DISTINCT a.col1, b.col2, c.col3, d.col4, e.col5, f.col6, g.col7, h.col8, 
i.col9, j.col10 
From test_a a 
left join test_b b on a.col1 = b.col2 
left join test_c c on c.col1 = d.col2 
left join test_d d on d.col1 = c.col2 
left join test_e e on e.col1 = d.col2 
left join test_f f on f.col1 = e.col2 
left join test_g g on g.col1 = f.col2 
left join test_h h on h.col1 = a.col1 
left join test_i i on i.col1 = f.col2 
left join test_j j on j.col1 = i.col2 
Where a.col2 = 'Y' 
and c.col4 = 1 
limit 50; 

如果我用order by子句運行它,則需要30-40秒執行。

我嘗試使用mysql:- USE INDEX FOR ORDER BY (idx_h_col5) 提供的索引提示功能,但我在執行此查詢時出現語法錯誤。錯誤消息說不正確的語法附近

我有一個組合索引在按順序使用的子句。我也嘗試在這個列上創建一個索引,但沒有任何真正的工作。

任何輸入將是很大的幫助。

在此先感謝。

問候, 瑪納斯

+0

多少行做的表有一個簡單的指標?如果您提供了有序查詢的執行計劃,這將有所幫助。表的結構(PK,FKs)和現有的索引。 –

+0

大多數表格都有百萬行以上的行。我會得到解釋的輸出並把它放在這裏。謝謝 –

回答

1

的MySQL可以使用按鍵進行排序,而不是獲取數據後的結果排序,但只有滿足幾個條件。 你可以在這裏看到這些條件的列表:http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html

在你的情況,我認爲多個JOIN阻止快速排序。其中所提到的案件中,MySQL不能使用索引來排序是:

您在ORDER BY聯接許多表和 列不是所有從第一非恆定表 即 是用於檢索行。 (這是EXPLAIN輸出 第一表 沒有一個const連接類型。)

我不知道是否有辦法解決它。它取決於表結構和實際查詢。

要獲得更多幫助,請嘗試張貼有序查詢的說明輸出。

0

我第一次嘗試在添加複合指數:

Table a 
    (col2, col1) 

Table b 
    (col4, col1) 

Table h 
    (col5)