首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >包含"Distinct()“的第一次慢速查询

问包含"Distinct()“的第一次慢速查询
EN

Stack Overflow用户
提问于 2012-11-19 11:54:58
回答 1查看 273关注 0票数 3

在浏览了网络之后,许多讨论都涉及到了我问题的各个方面,但我没有看到适用于这里的模式:

我有一个基本的.NET WinForm应用程序,使用EF3.5和MySQL。该应用程序在大多数查询中运行良好,但是任何包含Distinct()的查询都非常缓慢,或者导致“操作完成前经过的超时时间或服务器没有响应”。在计算机的重新启动之后第一次运行异常。也就是说,当重新启动应用程序时,即使在停止并重新启动MySQL服务之后,Distinct()查询也可以从现在开始正常工作(即不到1秒)。

我不能通过重新运行应用程序或重新启动MySQL来重现问题,这一事实排除了EF编译或MySQL缓存是一个因素。只有在重新启动之后,问题才会重新发生。让我觉得这可能是.NET初始化问题或者其他与操作系统相关的问题。这个问题已经在XP和Win 7上观察到了。

任何想法都会受到赞赏。(关于在不重新启动机器的情况下尝试再现问题的想法,这是非常不切实际的:-)

更新:

EF生成的查询如下所示:

代码语言:javascript
复制
SELECT Distinct1.C2 FROM (
    SELECT DISTINCT YEAR(Extent1.RecDate) AS C2 
    FROM dailyrecord AS Extent1
    WHERE (Extent1.STN = 430030) AND (Extent1.WBAN = 99999)
) AS Distinct1;

在mysql中运行这个程序第一次需要大约30次,甚至在重新启动mysql之后也要花费大约1次。重新启动后回到30岁。操作系统似乎第一次读取整个db文件,但之后没有读取(后续查询的HD活动非常少,即使修改了查询参数)。

我怎样才能刷新操作系统的读缓存来测试我的理论?

EN

回答 1

Stack Overflow用户

发布于 2012-11-30 12:55:34

经过相当多的测试之后,出现了这样的情况:

  • 根据定义,许多查询在MySQL和可能(M)任何DBMS中都非常慢,因为它们要求读取整个数据文件,就像上面的“definition”查询一样,其中" where“子句包含主键的一部分,但不包括整个主键(在本例中,主键是4个字段的组合)。
  • 如果慢速查询在应用程序中是一个常见且烦人的问题,则应该在搜索条件("WHERE“字段)上添加索引。这将大大加快查询速度(并最终解决了最初发布的问题),但它将增加磁盘上的数据(.MYI文件)的大小,同时轻量级地减小.MYD文件的大小,但总体上增加了总数据大小。添加索引可能会增加插入、更新和删除查询的时间,因为索引也需要更新。插入大部分是在一对一的基础上完成的,因此性能上的损失往往不明显。与大容量删除查询不同(见下文)。
  • 查询的不有效性被操作系统掩盖(在我的例子中是masked )。任何需要按记录读取整个表记录的查询在第一次遇到时都非常缓慢。但是,操作系统将缓存文件,即使参数发生变化,后续查询也会快得多,即使查询本身发生了变化:任何需要读取整个表文件的无效查询一旦被OS缓存,都会很快出现。这使得您的查询很难调优,因为您需要在测试之间重新启动操作系统。在浏览网络之后,我还没有找到一种实用的方法来刷新Windows中的读缓存。
  • 一个相关的低效查询是:从myTable中删除field1 = value。如果有许多记录(在我的例子中是10,000个记录的30秒)要删除(在所有这些示例中都使用MySQL,存储引擎MYISAM ),这将是缓慢的,即使在field1上有一个索引。这是因为DBMS需要将整个表文件从(到)磁盘读取(并可能写入)(取决于物理上执行删除的方式)。同样,这将被操作系统掩盖:它第一次速度很慢,但是在后续的查询中速度相当快(在我的XP机器上快30倍),因为操作系统做了一些魔术,这是困难的(不可能的?)关掉。如上所述,添加索引可能会增加删除查询所需的时间。

如有任何意见或评论,敬请见谅!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13453282

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档