编辑:感谢大家的意见。我已经尝试了你的大部分建议,但他们没有帮助。我需要补充说我正在使用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
答案 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
查询中所有字段的索引。
是的,它会复制数据,但我们可以转到下一个问题讨论点。