【问题标题】:How to optimize this MySQL query .It takes nearly 2 secs to execute如何优化这个 MySQL 查询。执行需要将近 2 秒
【发布时间】:2010-11-01 07:24:48
【问题描述】:

我最近将我的项目从 SQL SErver 转换为 MySQL 。

我确实看到一个在 SQL Server 中执行速度更快的查询在 mysql 中需要更多时间(2 秒)。

我在这里做错了什么吗?帮助我优化它。谢谢s

SELECT ReadingDateTime, SUM(DATA) AS PowerTotal FROM
LTMeterReading WHERE MeterID IN(59) and DataTypeID=48 and
ReadingDateTime >= '2010-04-01 12:00:00 AM' AND
ReadingDateTime < '2010-04-02 12:00:00 AM'
GROUP BY ReadingDateTime ORDER BY ReadingDateTime

【问题讨论】:

  • 请在此处粘贴SHOW CREATE TABLE
  • ...以及'EXPLAIN SELECT ReadingDateTime....'的输出

标签: sql-server mysql


【解决方案1】:

您可以在您检查的列上放置索引,但这可能会影响您的插入时间。

【讨论】:

    【解决方案2】:

    尝试添加索引,按此特定顺序覆盖DataTypeID + MeterID + ReadingDateTime

    另外 - ORDER BY 子句在这里已过时:在您按 ReadingDateTime 分组后 - 数据已按此字段升序排序。

    【讨论】:

    • 小心!数据可能会出现排序,但除非您使用“排序依据”,否则不能保证排序。一些数据库在分组时不使用常规排序(例如,参见 Oracle 的“Hash Group By”)。
    • @Lord Peter:出于某种原因,我认为这个问题专门针对 mysql,我的话是正确的。
    • 嗨,我尝试了索引(DataTypeID、MeterID、ReadingDateTime),但它需要将近 8 秒。比以前多了。还有一个问题,SQL Server 在没有索引的情况下怎么会这么快。
    • @Aashath:你看过查询计划吗?这个查询检索了多少记录(占所有记录的百分比)(当然没有分组)?
    • @zerkms 仅供参考:我在 MeterID 随机变化的循环中执行此查询。
    【解决方案3】:

    表中有多少行? DATA的数据类型是什么? ReadingDateTime、MeterID、DataTypeID 上有任何索引吗?

    【讨论】:

    • 该表有近 100 万条记录。我还没有索引任何东西。数据 - 十进制
    • 请添加一些索引(您的查询表明您可能希望查看导致此代码优化它的业务逻辑)。
    【解决方案4】:

    我终于通过将 MySQL 表引擎更改为 MyISAM 来修复它,之后它的速度非常快。谢谢大家。

    【讨论】:

      猜你喜欢
      • 2021-02-01
      • 2011-04-25
      • 2016-02-02
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      相关资源
      最近更新 更多