2013-08-22 117 views
0

編輯:謝謝大家的意見。我已經嘗試了大部分建議,但他們沒有幫助。我需要補充的是,我通過使用Connector/J 5.1.26(對不起,以前沒有提到過)通過Matlab來運行此查詢。最後,我認爲這是執行時間增加的原因,因爲當我「直接」運行查詢時,需要0.2秒。但是,使用Connector/J從未遇到如此巨大的性能提升。鑑於這些新的信息,你有什麼建議嗎?我很抱歉沒有透露過此事,但再次,我從未體驗過Connector/J的性能影響。MySQL表查詢異常緩慢(使用Matlab的連接器/ J)


我在MySQL的下表(從HeidiSQL採取CREATE代碼):

CREATE TABLE `data` (
    `PRIMARY` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, 
    `ID` VARCHAR(5) NULL DEFAULT NULL, 
    `DATE` DATE NULL DEFAULT NULL, 
    `PRICE` DECIMAL(14,4) NULL DEFAULT NULL, 
    `QUANT` INT(10) NULL DEFAULT NULL, 
    `TIME` TIME NULL DEFAULT NULL, 
    INDEX `DATE` (`DATE`), 
    INDEX `ID` (`SYMBOL`), 
    INDEX `PRICE` (`PRICE`), 
    INDEX `QUANT` (`SIZE`), 
    INDEX `TIME` (`TIME`), 
    PRIMARY KEY (`PRIMARY`) 
) 

它被填充有大約36萬行數據。

以下查詢需要10秒以上來執行:

Select ID, DATE, PRICE, QUANT, TIME FROM database.data WHERE DATE 
>= "2007-01-01" AND DATE <= "2010-12-31" ORDER BY ID, DATE, TIME ASC; 

我有百萬,其中類似的查詢將花費幾分之一秒的行其他表。我無法弄清楚可能是什麼原因導致這個問題變得如此緩慢。任何想法/提示?

說明:

id = 1 
select_type = SIMPLE 
table = data 
type = ALL 
possible_keys = DATE 
key = (NULL) 
key_len = (NULL) 
ref = (NULL) 
rows = 361161 
Extra = Using where; Using filesort 
+1

請不要調用你的表「數據」或你的數據庫「數據庫」。它告訴讀者關於什麼是內在的。就好像你有一個盒子裏裝着東西,而你把它標記爲「重要」。使用描述性名稱。 –

+2

有任何EXPLAIN輸出? –

+0

所有保留字都有可能引發問題嗎?也許,在查詢中的'DATE'和'TIME'附近得到一些反引號。 – Buggabill

回答

3

您所要求的一系列數據。時間可能正在花費排序結果。

對較小日期範圍的查詢是否更快?例如,

WHERE DATE >= '2007-01-01' AND DATE < '2007-02-01' 

一種可能性是,優化器可以使用在id用於排序索引,做全表掃描,以過濾掉的時間範圍。使用索引進行排序通常不是最理想的。

select t.* 
from (Select ID, DATE, PRICE, QUANT, TIME 
     FROM database.data 
     WHERE DATE >= "2007-01-01" AND DATE <= "2010-12-31" 
    ) t 
ORDER BY ID, DATE, TIME ASC; 

我認爲這將迫使優化器使用date指數的選擇,然後使用排序排序文件 - 但有一個派生表的成本:正如你可以嘗試查詢。如果您沒有較大的結果集,這可能會顯着提高性能。

+0

運行這個實際上會使查詢運行時間稍長一些Matlab和直接) –

+0

@ Mr.Kinn。 。 。有多少行正在返回?它在更短的日期範圍內速度有多快? –

+0

查詢(通過Matlab運行)返回239,245行,耗時約10秒。通過HeidiSQL運行的相同確切查詢需要0.20秒。在一年的時間範圍內,查詢需要1.3秒(在Matlab中)並返回61,086行。第二個查詢在HeidiSQL中需要0.14秒。 –

0

我假設你已經試過OPTIMIZE TABLE,但沒有得到任何結果。

您可以嘗試使用通過替換現有的日期索引覆蓋索引(在更多的磁盤空間爲代價,並有輕微放緩下來UPDATE S)與

CREATE INDEX data_date_ndx ON data (DATE, TIME, PRICE, QUANT, ID); 

和/或可以嘗試使用相同的模式創建一個空表data2。然後將SELECT的所有內容data表分成data2並對新表運行相同的查詢。這可能是data表需要被壓縮超過OPTIMIZE可能 - 可能在文件系統級別。

此外,請檢查該查詢的輸出EXPLAIN SELECT...

0

我不熟悉MySQL,但MSSQL所以也許:

怎麼樣來提供指數,這完全覆蓋在你的select查詢中的所有領域。

是的,它會重複數據,但我們可以移動到下一個問題討論點。