【问题标题】:Fast query when executed individually, slow when nested单独执行时查询快,嵌套执行时慢
【发布时间】:2011-11-23 00:59:32
【问题描述】:

我正在尝试查找一系列特定日期的最近进入时间。当我跑步时

select max(ts) as maxts from factorprice where ts <= '2011-1-5'

它很快就会返回。

EXPLAIN 给出了 select_type SIMPLE 和“选择优化掉的表”。

但是当我运行时

select (select max(ts) from factorprice where ts <= dates.dt) as maxts, dates.dt 
   from 
   trends.dates where dates.dt in ('2011-1-6');

返回需要很长时间(~10 秒)。

解释给出:

  • select_type=PRIMARY table=dates rows=506 Extra=Using where
  • select_type=依赖子查询表=factorprice type=index possible_keys=PRIMARY key=PRIMARY keylen=8 行=26599224 Extra=正在使用 在哪里;使用索引

此查询也需要很长时间(10 秒)

select dt, max(ts) as maxts from factorprice as f inner join trends.dates as d
   where ts <= dt and dt in ('2011-1-6')
   group by dt;

解释给出:

  • select_type=SIMPLE table=d type=ALL rows =509 Extra=Using where
  • select_type=SIMPLE table=f type=range possible_keys=PRIMARY key=PRIMARY keylen=8 rows=26599224 Extra=Using 在哪里;使用索引

我想在许多不同的日期执行相同的操作。有没有办法可以有效地做到这一点?

【问题讨论】:

  • 在查询前添加EXPLAIN,看看瓶颈出现在哪里。然后发回,以便您收到更好的答案。
  • 我猜它正在为trends 上的每一行运行嵌套查询。加入版本可能有类似的问题,因为加入没有 ON 条件。
  • dates.dt 上有索引吗?
  • bfavaretto:当我向“in (...)”添加第二个日期时,第二个查询所需的时间是以前的两倍。
  • Gruikya:没有,所以我加了一个,但没有任何改变。

标签: mysql performance


【解决方案1】:

看起来像这个错误:

http://bugs.mysql.com/bug.php?id=32665

也许如果你在 dates.dt 上创建一个索引,它就会消失。

【讨论】:

  • 在 dt 上添加索引后,我没有看到任何行为变化。这是否有点不同,因为它不应该兑现子查询?
  • MySQL 查询优化器在评估子查询执行路径时存在一些错误,有时,在主查询表上添加索引有助于修复这些错误(即使所述索引应该没有真正帮助)。太糟糕了,在这种情况下它没有帮助。
  • 顺便问一下,您是否在 dates.dt 上创建了唯一索引?它似乎解决了我刚刚创建的测试数据库的问题(但在你的情况下可能没有意义)。
  • 我同时添加了 PRIMARY 和 UNIQUE,但似乎都没有改变行为。 :(
【解决方案2】:

这部分 SQL 是一个依赖查询

select max(ts) from factorprice where ts <= dates.dt

对结果集中的每一行执行。所以总时间大约是独立查询的时间乘以结果集中的行。

【讨论】:

  • 当我向“in (...)”添加第二个日期时,第二个查询所需的时间是以前的两倍。
【解决方案3】:

从您的 EXPLAIN 输出来看。此查询访问日期表中的 506 行,然后对于这些行中的每一行,在 factorprice 表中超过 2600 万行。 10 秒完成所有这一切并不算太糟糕。

我的猜测是您无意中创建了一个 CROSS JOIN 情况,其中一个表的每一行都与另一个表中的每一行匹配。

【讨论】:

    猜你喜欢
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    相关资源
    最近更新 更多