我正试图在一堆特定日期找到最近的进入时间。当我运行
select max(ts) as maxts from factorprice where ts <= '2011-1-5'
返回非常快。
EXPLAIN给出select_type SIMPLE和"Select tables optimized away"。
但是当我运行
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=DEPENDENT SUBQUERY表=factorprice type=indexpossible_keys=PRIMARY key=PRIMARY keylen=8 rows=26599224 Extra=Using在那里;使用指数
这个查询也需要很长时间(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在那里;使用指数
我想在许多不同的日期做同样的操作。有什么办法能让我更有效率地做到这一点吗?
看起来像这样的bug:
http://bugs.mysql.com/bug.php?id=32665也许如果你创建一个日期索引。Dt,它会消失
SQL的这一部分是一个依赖查询
select max(ts) from factorprice where ts <= dates.dt
,对结果集中的每一行执行。因此,总时间大约是独立查询的时间乘以结果集中的行数。
从EXPLAIN输出判断。该查询访问日期表中的506行,然后对每一行访问factorprice表中的2600多万行。10秒做完这些还不错。
我的猜测是,您无意中创建了一个CROSS JOIN情况,其中一个表的每一行都与另一个表中的每一行相匹配。