2010-02-05 33 views
0

我的应用程序中有一种情况。对于图表中的每个x轴点,我绘制了5个y轴值。要计算这5个值中的每一个,我需要进行4个不同的查询。也就是说,对于每个x轴点,我需要激发20个sql查询。MySql multiple选择批处理.net

现在,我需要在我的图表中绘制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次。前三次对表T1和T2的连接,传入col4的不同值。接下来的两次针对表T3和T2的加入,为col4传递不同的值。这5个值是特定x轴点的y轴值。

所有这些查询返回的数据都是相同的格式。所以,我们尝试在所有这些查询中进行UNION ALL。没有实质性差异。然而,一个奇怪的事情是,在对表T1上的外键进行索引后(虽然它包含了一个十万条记录),查询使用索引,但是它们变慢了。有时候,查询会花费双倍的时间来返回数据。

+0

您确定瓶颈在创建连接并通过电线获取数据吗?也许查询本身需要时间,你需要优化它们? – Oded 2010-02-05 11:42:57

+0

@Oded,我认为我们已经通过将查询合并为一个来消除创建连接/获取数据瓶颈。所以,是的,查询本身需要时间,我正在寻找如何优化它们的帮助:) – 2010-02-10 05:17:40

回答

0

我们发现使用MSSQL Server在同一个数据库上完全相同的查询性能非常好。再读一点,我们发现很多人抱怨Windows上的MySQL表现不佳。

我的问题是我能做些什么来提高查询的性能。我们最终选择的答案是转移到MSSQL Server。

0

你消除了数据库连接问题。

所以问题一定在于查询本身需要一些时间。

对于这样的小表,您的联接应该非常快,除非您的外键在10K记录中 - 一个没有索引。 如果不是,索引它应该会大大提升。

此外,很可能您的800个查询可以合并为一个。你也应该在那里获得(即使你添加了一些额外的连接)。

我想喜欢的东西

SELECT 
    a.*, 
    b1.needed_value, 
    b2.needed_value, 
    b3.needed_value, 
    b4.needed_value, 
    b5.needed_value 
FROM 
    table1 a, 
    table2 b1, 
    table2 b2, 
    table2 b3, 
    table2 b4, 
    table2 b5 
WHERE 
    a.a_key = b1.b_key AND 
    a.a_key = b2.b_key AND 
    a.a_key = b3.b_key AND 
    a.a_key = b4.b_key AND 
    a.a_key = b5.b_key AND 
    a.x_id IN (x1, x2, ...., x40) 
+0

我已编辑我的问题,包括我们正在执行的查询的示例。我在包含很多行的表上编制了外键索引。当它刚好在10K左右时,查询花费的时间较少。但是,当该表中的数据增加到约2万行时,与没有索引相比,查询时间增加了一倍。索引是否可以减慢查询速度? – 2010-02-10 05:22:26

+0

好的,所以加入不再是瓶颈。 你有col4的索引吗? – 2010-02-11 12:23:12

+0

是的,我确实有col4的索引。然而,col4将只包含2个值。 '我'或'一个'。我不确定索引是否会产生影响。因此,值“a”和“i”的行数将几乎相等。 – 2010-02-15 06:10:08

0

没有看到你正在运行的查询的一些例子,这可能是件很难的事情就很好的建议。我的第一个猜测是尝试使用UNION将具有相同结果结构的多个不同查询合并为一次仅查询数据库的单个查询。

但我想你所描述的是,你有价值依赖性,所以你不能运行其他查询,直到你有从以前的查询值。你可以通过使用“派生表”来解决这个问题,它只是一个充当表的SELECT。

SELECT yaxis.*,xaxis.xval FROM yaxis JOIN (
SELECT xaxis.xval FROM xaxis WHERE xval IN (4, 23, 32, 75, 78) AND group_id=121 
) AS xaxis ON yaxis.xval=xaxis.xval 

基本上,把一个SELECT括号,并给它命名,你可以把就像一个数据库表。

+0

感谢您的建议。我们尝试了联盟方法,但它无助于缩短时间。查询是独立的。不依赖于前一个查询的值。 – 2010-02-10 05:33:43