0

编辑:谢谢大家的评论。我已经尝试了您的大部分建议,但没有帮助。我需要补充一点,我正在使用 Connector/J 5.1.26 通过 Matlab 运行此查询(抱歉之前没有提及)。最后,我认为这是执行时间增加的原因,因为当我“直接”运行查询时需要 0.2 秒。但是,我从未遇到过使用 Connector/J 对性能造成如此巨大的影响。鉴于这些新信息,您有什么建议吗?我很抱歉没有更早地披露这一点,但我再次强调,我从未体验过 Connector/J 对性能的影响。


我在 mySQL 中有下表(CREATE代码取自 HeidiSQL):

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`)
)

它填充了大约 360,000 行数据。

以下查询需要 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
4

3 回答 3

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索引进行选择,然后使用文件排序进行排序——但是有派生表的成本。如果您没有大型结果集,这可能会显着提高性能。

于 2013-08-22T19:39:58.007 回答
0

我假设您已经尝试过OPTIMIZE TABLE但没有得到任何结果。

您可以UPDATE通过将现有日期索引替换为

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

和/或您可以尝试data2使用相同的架构创建一个空表。然后SELECT将表的所有内容data放入data2并针对新表运行相同的查询。可能需要对data表进行更多的压缩OPTIMIZE- 可能是在文件系统级别。

此外,请查看EXPLAIN SELECT...该查询的输出。

于 2013-08-22T19:42:46.347 回答
0

我不熟悉 mysql 但 mssql 所以也许:

如何提供完全覆盖select查询中所有字段的索引。

是的,它会重复数据,但我们可以转到下一个问题讨论点。

于 2013-08-22T19:43:35.630 回答