【问题标题】:MySQL Query 127 seconds of executionMySQL Query 127 秒执行
【发布时间】:2013-04-24 12:05:35
【问题描述】:

我有这个 SQL 查询:

SELECT * FROM magnitudes t1 INNER JOIN value_magnitudes t2 ON t1.id = t2.magnitude_id WHERE t1.floor_id = 42 AND t2.reading_date = (SELECT Max(reading_date) FROM value_magnitudes WHERE t2.magnitude_id = t1.id);

我的数据库架构是:

CREATE TABLE magnitudes (
  id INTEGER UNSIGNED  NOT NULL   AUTO_INCREMENT,
  name VARCHAR(255)  NULL  ,
  sdi_id VARCHAR(255)  NULL  ,
  sdi_id_floor VARCHAR(255)  NULL  ,
  visible TINYINT(1) UNSIGNED  NULL  ,
  history TINYINT(1) UNSIGNED  NULL  ,
  created_at DATETIME  NULL  ,
  updated_at DATETIME  NULL  ,
  floor_id INT(11)  NULL  ,
  unit VARCHAR(255)  NULL  ,
  kind_id INT(11)  NULL  ,
  sample_time INT(11)  NULL  ,
  history_from DATETIME  NULL DEFAULT 2011-02-22 11:18:07   ,
PRIMARY KEY(id));

CREATE TABLE value_magnitudes (
  id INTEGER UNSIGNED  NOT NULL   AUTO_INCREMENT,
  value FLOAT  NULL  ,
  magnitude_id INT(11)  NULL  ,
  sdi_belongs_id VARCHAR(255)  NULL  ,
  reading_date DATETIME  NULL  ,
  created_at DATETIME  NULL  ,
  updated_at DATETIME  NULL    ,
PRIMARY KEY(id));

我真正想要的是,根据magnitudes.id on values_magnitudes.magnitude_id 的最后一个updated_at 获得最后一个value_magnitudes

谢谢。

【问题讨论】:

  • value_magnitudes.magnitude_id 上的索引会有所帮助 - 但您应该始终针对您正在测试运行缓慢的查询运行 EXPLAIN,这将向您展示它是如何“在幕后”工作的,并且是开发人员数据库工具包的重要组成部分
  • 其实我是一名程序员,数据库已经做好了XD,每次我必须在这个数据库中做一个SQL查询时我都很紧张,我不能花时间去改进或与DB,只是一些 SQL,即使我也不是 SQL 人,任何人都无能为力,所以我认为 stackoverflow 是最好的解决方案,问。顺便说一句,感谢您的帮助。
  • 如果您不能花时间添加该索引,或者如果 SQL 人员无法为数据库设计添加正确的索引(value_magnitudes.magnitude_id 与magnitudes.id 应该使用外部索引)键约束),那么提高查询速度几乎是不可能的
  • 好的,谢谢,我会告诉他们,我只是想找到解决办法,谢谢。

标签: php mysql sql database-schema


【解决方案1】:
SELECT TOP 1 VM.* FROM value_magnitudes VM, magnitudes M  WHERE M.id = VM.id ORDER BY updated_at DESC

【讨论】:

  • 我做这个查询是为了测试SELECT TOP 1 VM.* FROM value_magnitudes VM, magnitudes M WHERE M.id = VM.magnitude_id AND M.floor_id = 42 ORDER BY updated_at DESC,但执行时间仍然很长,这可能是问题所在?
【解决方案2】:

SELECT VM.* FROM value_magnitudes VM, magnitudes M WHERE M.id = VM.id ORDER BY updated_at DESC LIMIT 0,1;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多