【问题标题】:speeding up my mysql statement加快我的mysql语句
【发布时间】:2013-04-14 22:33:21
【问题描述】:

我有下表:

+---------------------+-------+
| t                   | price |
+---------------------+-------+
| 2013-04-22 13:23:51 |  9.42 |
+---------------------+-------+

其中 t 是时间戳类型,价格是浮点数。

表很大,大约有 500K 行。

任务:

我将显示表格和每行过去 3 天的最低价格。

所以我写了以下内容:

select *,(
  select max(b.price)
  from my_table b 
  where b.t<a.t and date(b.t)>=adddate(date(a.t),-3)
) from my_table a;

问题是它从来没有完成我的查询,看起来它挂了....有没有办法加快查询速度?还是我做错了什么?

【问题讨论】:

  • 你在timestamp 上有index 吗?这将有很大帮助
  • 是的,我没有设置为索引。

标签: mysql performance select virtual


【解决方案1】:

我认为您的 adddate 函数可能不正确。尝试像这样使用它:ADDDATE(a.t, INTERVAL -3 DAY)

【讨论】:

  • 我只是用更少的行再次尝试,但速度也很奇怪:mysql> select count() from my_table where date(t)=date(now()); +----------+ |计数() | +----------+ |第634章+----------+ mysql> SELECT at, a.price, (SELECT MAX(b.price) FROM my_table b WHERE bt BETWEEN at - INTERVAL 3 DAY and at - INTERVAL 1 SECOND ) from my_table a WHERE date(t)=date(now());
  • 您不能将表 a 和 b 连接在一起吗?基本上看起来您想从每个表中获取所有数据并将其放入一个表中,但 sql 不知道如何匹配它。我会尝试加入,然后选择 *, max(b.price) from ......
【解决方案2】:

这个查询应该很快工作:

SELECT *,
    (   SELECT max(b.price)
        FROM my_table b
        WHERE b.t > a.t - interval 3 day
          AND b.t < a.t
    )
FROM my_table a

但您需要确保在 mytable(t) 上有一个索引 - 我假设该字段是 timestampdatetime

【讨论】:

    【解决方案3】:

    我会试试这个:

    select *,(
      select max(b.price)
      from my_table b 
      where b.t between a.t - interval 3 day and a.t - interval 1 second
    ) from my_table a;
    

    并确保 my_table.t 有一个索引:

    alter table my_table add index ix_t (t);
    

    【讨论】:

    • 嗨罗斯,谢谢你的回答,我在我的表中添加了索引,但运行时间仍然需要很长时间(超过 15 分钟,我终于不得不打破它)......所以,还有其他运行速度更快的解决方案吗?
    猜你喜欢
    • 2012-04-27
    • 1970-01-01
    • 2016-11-20
    • 1970-01-01
    • 2013-05-17
    • 2019-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多