【发布时间】:2021-01-16 03:40:32
【问题描述】:
您好,这是我的查询,大约需要一个小时才能完成。该表是 innodb 中的 700 万条记录。我在(时间戳,符号)上有一个索引。 Test7() 是用于得出前一周日期的函数。 我正在使用 mysql 5.3。关于如何加快速度的任何建议?谢谢
'''''''''''
SELECT Archive_dataPolygon.timeStamp,
Archive_dataPolygon.symbol,
Archive_dataPolygon.open,
Archive_dataPolygon.high,
Archive_dataPolygon.low,
Archive_dataPolygon.close,
Archive_dataPolygon.volume,
Archive_dataPolygon.afterHours,
Archive_dataPolygon.preMarket,
d2.timeStamp,
d2.symbol,
d2.open,
d2.high,
d2.low,
d2.close,
d2.volume,
d2.afterHours,
d2.preMarket,
d3.timeStamp,
d3.symbol,
d3.open,
d3.high,
d3.low,
d3.close,
d3.volume,
d3.afterHours,
d3.preMarket,
d4.timeStamp,
d4.symbol,
d4.open,
d4.high,
d4.low,
d4.close,
d4.volume,
d4.afterHours,
d4.preMarket,
round((Archive_dataPolygon.high-Archive_dataPolygon.open)/Archive_dataPolygon.open,3) as 'quoteChangePercent'
from Archive_dataPolygon
inner join Archive_dataPolygon d2 force index(timeStampSymbol) on d2.symbol=Archive_dataPolygon.symbol and d2.timeStamp = test7(Archive_dataPolygon.timeStamp)
inner join Archive_dataPolygon d3 on d3.symbol=Archive_dataPolygon.symbol and d3.timeStamp = test7(d2.timeStamp)
inner join Archive_dataPolygon d4 on d4.symbol=Archive_dataPolygon.symbol and d4.timeStamp = test7(d3.timeStamp)
where Archive_dataPolygon.timeStamp < NOW() - interval 4 day and Archive_dataPolygon.timeStamp > NOW() - INTERVAL 20000 DAY and Archive_dataPolygon.open >= 50 and Archive_dataPolygon.open <= 70 and Archive_dataPolygon.symbol not IN("%Nasdaq%") and round((Archive_dataPolygon.high-Archive_dataPolygon.open)/Archive_dataPolygon.open,3)=%quoteChangePercent%
HAVING isnull(Archive_dataPolygon.timeStamp)=false and isnull(d2.timeStamp)=false and isnull(d3.timeStamp)=false and isnull(d4.timeStamp)=false
order by Archive_dataPolygon.timeStamp desc
LIMIT 2000
'''''''''''''''
【问题讨论】:
-
函数不能使用索引,所以无论
test7()是什么,它都会破坏性能(假设timestamp被索引)。IN("%Nasdaq%")不能使用索引;这似乎是您的数据模型中的一个缺陷。%quoteChangePercent%看起来像一个错误。 -
HAVING通常保留用于汇总结果,所以我怀疑它在这里的使用。WHERE... IS NOT NULL会更常见。 -
虽然它对性能没有影响,但为所有表实例设置别名并没有什么害处。
-
而且...您的结果集很难使用,因为区分 d2、d3 等很棘手
标签: mysql performance query-optimization long-integer