2013-10-30 51 views
-1

我有很久以前开发的这个大型的MySQL查询。它远非完美,现在是优化它的时候了。我甚至不知道从哪里开始,可能会在涉及的表中添加索引?或者将查询分解为子查询,将它们存储为视图,然后使用这些视图重新组合结果? 请告诉我你将如何处理此类任务。MySQL怪物查询优化

链接查询: http://pastebin.com/sVvW8PCc

使用的MySQL版本:5.0.96

目前,它加载在像6,5秒钟,我看这个时间缩短到2秒或更少。

预先感谢您!

+0

请显示来自EXPLAIN的输出。 –

+0

哇 - 从哪里开始?我会首先删除所有子查询 - 为什么你不能只加入连接? (SELECT MAX(d_updated)FROM table_d),INTERVAL 1 DAY))))));}} AS table_d1 ON Ticker = Ticker1“可以是”LEFT OUTER JOIN table_d as table_d1 ...“。 –

+0

有关此查询的EXPLAIN声明位于此链接之下:https://docs.google.com/spreadsheet/ccc?key=0At34xVWtnIMWdHpTMkFfTzUtRi0wX1ZQb3BxX3V1aVE&usp=sharing – Vasily802

回答

0

如果你没有索引,那就先做。

它看起来像你在每个UNION中使用相同的查询,只是改变通配符(换句话说,连接都是相同的,只有通配符是不同的。)如果是这样,专注于UNION的1部分只有(例如,WIND)并确保尽可能有效地运行。然后,您可以将更改复制到其他人。

我会怀疑(如果前面的陈述是真的),您可以通过使用SELECT子句中的CASE语句将UNION查询合并为一个查询。 (您还需要使用GROUP BY)

您经常会确定MAX(d_updated)。我不确定MySQL是否缓存了这个结果,或者每次尝试确定它的结果。为什么不在执行此查询之前确定一次值,然后将其作为硬编码值发回您的查询中?

最后,我会推荐使用视图,不是为了性能,而是为了可读性。

+0

只需添加索引就可以将时间从6,5秒缩短到不到1秒。谢谢你的回答。 – Vasily802