2010-02-05 87 views
0

我的應用程序中有一種情況。對於圖表中的每個x軸點,我繪製了5個y軸值。要計算這5個值中的每一個,我需要進行4個不同的查詢。也就是說,對於每個x軸點,我需要激發20個sql查詢。MySql multiple選擇批處理.net

現在,我需要在我的圖表中繪製40個這樣的點。它導致了一個可悲的表現,從數據庫中獲取所有數據需要花費將近一分鐘的時間。 4個不同的查詢中的每一個都由2個表之間的連接組成。一個只有6行。另一個接近10,000。 4個查詢中的每一個都有不同的WHERE子句,因此它們是不同的查詢。對於x軸中的每個點,只有where子句的值發生更改。

我已經嘗試將每個4個查詢合併成一個大字符串。基本上批量四個選擇。這些再次按每個y軸值進行批處理。 因此,對於每個x軸點,我現在發射一個由20個不同的選擇語句組成的大命令。

從技術上講,我應該會經歷一個很大的性能提升,對吧?而不是擊中db 40x5x4 = 800次,我現在只擊中了40次。但不是花60秒,而是花50-55秒......沒有什麼幫助。

我正在使用MySql 5.1和它的.Net連接器的6.1版本。

我該怎麼做才能提高性能?

編輯:

其中4個查詢如下:

SELECT 
    SUM(TIME_TO_SEC(TIMEDIFF(T1.col2, T1.col1))* T2.col1/(3600 *1000)) AS TotalTime 
FROM Table T1 
    JOIN Table T2 
    ON T1.col3 = T2.col3 
WHERE T1.col4 = 'i' 
    AND T1.col1 >= '2009-12-25 00:00:00' 
    AND T1.col2 <= '2009-12-26 00:00:00'; 

其他3個查詢是類似的,只是where子句稍有變化。這組4個查詢被激發5次。前三次對錶T1和T2的連接,傳入col4的不同值。接下來的兩次針對表T3和T2的加入,爲col4傳遞不同的值。這5個值是特定x軸點的y軸值。

所有這些查詢返回的數據都是相同的格式。所以,我們嘗試在所有這些查詢中進行UNION ALL。沒有實質性差異。然而,一個奇怪的事情是,在對錶T1上的外鍵進行索引後(雖然它包含了一個十萬條記錄),查詢使用索引,但是它們變慢了。有時候,查詢會花費雙倍的時間來返回數據。

+0

您確定瓶頸在創建連接並通過電線獲取數據嗎?也許查詢本身需要時間,你需要優化它們? – Oded 2010-02-05 11:42:57

+0

@Oded,我認爲我們已經通過將查詢合併爲一個來消除創建連接/獲取數據瓶頸。所以,是的,查詢本身需要時間,我正在尋找如何優化它們的幫助:) – 2010-02-10 05:17:40

回答

0

我們發現使用MSSQL Server在同一個數據庫上完全相同的查詢性能非常好。再讀一點,我們發現很多人抱怨Windows上的MySQL表現不佳。

我的問題是我能做些什麼來提高查詢的性能。我們最終選擇的答案是轉移到MSSQL Server。

0

你消除了數據庫連接問題。

所以問題一定在於查詢本身需要一些時間。

對於這樣的小表,您的聯接應該非常快,除非您的外鍵在10K記錄中 - 一個沒有索引。 如果不是,索引它應該會大大提升。

此外,很可能您的800個查詢可以合併爲一個。你也應該在那裏獲得(即使你添加了一些額外的連接)。

我想喜歡的東西

SELECT 
    a.*, 
    b1.needed_value, 
    b2.needed_value, 
    b3.needed_value, 
    b4.needed_value, 
    b5.needed_value 
FROM 
    table1 a, 
    table2 b1, 
    table2 b2, 
    table2 b3, 
    table2 b4, 
    table2 b5 
WHERE 
    a.a_key = b1.b_key AND 
    a.a_key = b2.b_key AND 
    a.a_key = b3.b_key AND 
    a.a_key = b4.b_key AND 
    a.a_key = b5.b_key AND 
    a.x_id IN (x1, x2, ...., x40) 
+0

我已編輯我的問題,包括我們正在執行的查詢的示例。我在包含很多行的表上編制了外鍵索引。當它剛好在10K左右時,查詢花費的時間較少。但是,當該表中的數據增加到約2萬行時,與沒有索引相比,查詢時間增加了一倍。索引是否可以減慢查詢速度? – 2010-02-10 05:22:26

+0

好的,所以加入不再是瓶頸。 你有col4的索引嗎? – 2010-02-11 12:23:12

+0

是的,我確實有col4的索引。然而,col4將只包含2個值。 '我'或'一個'。我不確定索引是否會產生影響。因此,值「a」和「i」的行數將幾乎相等。 – 2010-02-15 06:10:08

0

沒有看到你正在運行的查詢的一些例子,這可能是件很難的事情就很好的建議。我的第一個猜測是嘗試使用UNION將具有相同結果結構的多個不同查詢合併爲一次僅查詢數據庫的單個查詢。

但我想你所描述的是,你有價值依賴性,所以你不能運行其他查詢,直到你有從以前的查詢值。你可以通過使用「派生表」來解決這個問題,它只是一個充當表的SELECT。

SELECT yaxis.*,xaxis.xval FROM yaxis JOIN (
SELECT xaxis.xval FROM xaxis WHERE xval IN (4, 23, 32, 75, 78) AND group_id=121 
) AS xaxis ON yaxis.xval=xaxis.xval 

基本上,把一個SELECT括號,並給它命名,你可以把就像一個數據庫表。

+0

感謝您的建議。我們嘗試了聯盟方法,但它無助於縮短時間。查詢是獨立的。不依賴於前一個查詢的值。 – 2010-02-10 05:33:43