我有一个非常简单的查询(三个条件;两个等于,一个之间)来自单个表,而在MySQL查询浏览器中,查询运行不到半秒,返回8300个记录。如果我使用MySQL数据连接器(实际上只是一个OLEDB包装器)运行完全相同的查询,则需要大约35秒。
正在使用的引擎是MyISAM(如果重要的话)。我正在使用Visual Studio 2008(如果重要的话,也是如此)。编辑:使用MySQL数据连接器5.2.5。编辑,编辑:切换到MySQL数据连接器6.0.3(最新版本)将其削减至29秒。
查询是:
select drh_data.reading_time, drh_data.raw_value, drh_data.float_value, drh_data.data_quality
from drh_data
where drh_data.site_id=202
and drh_data.device_id=7
and reading_time between '2009-04-08 11:15:01' and '2009-05-08 11:15:02'
order by drh_data.reading_time desc;
有什么想法吗?
更新:我终于开始检查CPU使用情况(由回答者建议),并发现我的应用程序使用了50%的CPU时间。运行MySQL(在CentOS中)的VirtualPC盒在这20(或左右)秒内有0%,所以问题全在客户端。我还对查询进行了一次解释,其中包含以下内容:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE drh_data range PRIMARY,idx_site_device_reading_receive idx_site_device_reading_receive 11 7674 Using where
我在这里被挖掘出来。有没有人有任何想法来解决这个问题?我打算通过LIMIT来解决选择,但我认为我不应该这样做。
答案 0 :(得分:1)
在使用ADO.NET与SQL Server查询分析器之前,我遇到过这个问题。当我们从查询分析器运行查询时,查询在亚秒内执行,当我们从我们的Web应用程序运行时,它需要花费超过2分钟。无论出于何种原因,将索引应用于表似乎可以加速我们的应用程序和数据库之间的数据连接。
我不知道MySQl和SQL Server之间的操作差异,但在我们的案例中似乎发生的另一件事是执行缓存已经填满,这使得所有未缓存的执行计划的执行速度变慢。我们实施了一个清除缓存的每周作业。
答案 1 :(得分:1)
我建议查看那些秒(CPU使用率)的工作是什么,是mysql还是你的代码或其他东西。您也可以考虑使用EXPLAIN
查看其中一个案例中发生的情况并进行比较。