MySQL表查询异常慢(使用Matlab的连接器/ J)

时间:2013-08-22 19:28:33

标签: mysql matlab

编辑:感谢大家的意见。我已经尝试了你的大部分建议,但他们没有帮助。我需要补充说我正在使用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

3 个答案:

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

答案 1 :(得分:0)

我假设你已经尝试OPTIMIZE TABLE并且没有结果。

您可以尝试使用覆盖索引(以更多磁盘空间为代价,并在UPDATE上略微放慢速度),方法是将现有日期索引替换为

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

和/或您可以尝试使用相同的架构创建一个空表data2。然后将SELECT data的所有内容data2转换为data并对新表执行相同的查询。可能需要将OPTIMIZE表压缩到EXPLAIN SELECT...以上 - 可能是在文件系统级别。

另外,请查看该查询的{{1}}输出。

答案 2 :(得分:0)

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

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

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