【发布时间】:2012-07-03 04:06:47
【问题描述】:
我的申请中有一个情况。对于图表中的每个 x 轴点,我正在绘制 5 个 y 轴值。要计算这 5 个值中的每一个,我需要进行 4 个不同的查询。即,对于每个 x 轴点,我需要触发 20 个 sql 查询。
现在,我需要在图表中绘制 40 个这样的点。它导致了可悲的性能,需要将近一分钟才能从数据库中取回所有数据。 4 个不同的查询中的每一个都包含 2 个表之间的连接。一个只有 6 行。另一个接近10,000。 4 个查询中的每一个都有不同的 WHERE 子句,因此它们是不同的查询。对于 x 轴上的每个点,只有 where 子句的值会发生变化。
我尝试将 4 个查询中的每一个组合成一个大字符串。基本上批量四选。这些再次针对每个 y 轴值进行批处理。 因此,对于每个 x 轴点,我现在正在触发一个包含 20 个不同选择语句的大命令。
从技术上讲,我的性能应该得到很大提升,对吧?而不是击中 db 40x5x4 = 800 次,我现在只击中了 40 次。但不是需要 60 秒,而是需要 50-55 秒……帮助不大。
我正在使用 MySql 5.1 及其 .Net 连接器的 6.1 版本。
我可以做些什么来提高性能?
编辑:
4 个查询之一如下:
SELECT
SUM(TIME_TO_SEC(TIMEDIFF(T1.col2, T1.col1))* T2.col1 / (3600 *1000)) AS TotalTime
FROM Table T1
JOIN Table T2
ON T1.col3 = T2.col3
WHERE T1.col4 = 'i'
AND T1.col1 >= '2009-12-25 00:00:00'
AND T1.col2 <= '2009-12-26 00:00:00';
其他 3 个查询类似,只是 where 子句略有变化。这组 4 个查询被触发 5 次。前 3 次针对表 T1 和 T2 的连接,为 col4 传递不同的值。接下来两次针对表 T3 和 T2 的连接,为 col4 传递不同的值。这 5 个值是特定 x 轴点的 y 轴值。
所有这些查询返回的数据格式相同。因此,我们尝试对所有这些查询执行 UNION ALL。没有本质区别。然而,一件奇怪的事情是,在对表 T1 的外键进行索引后[虽然它包含十万多条记录],查询正在使用该索引,但它们变得更慢了。有时,查询需要双倍的时间来返回数据。
【问题讨论】:
-
您确定瓶颈在于创建连接和通过网络获取数据吗?也许查询本身需要时间,您需要优化它们?
-
@Oded,我认为我们通过将查询合并为一个,消除了创建连接/获取数据的瓶颈。所以是的,查询本身需要时间,我正在寻求有关如何优化它们的帮助:)
标签: .net mysql optimization query-optimization