我有一张桌子
CREATE TABLE `symbol_details` (
`symbol_header_id` int(11) DEFAULT NULL,
`DATE` datetime DEFAULT NULL,
`ADJ_NAV` double DEFAULT NULL
)
有~20,000,000个条目。现在我想找到最接近季度末的ADJ_NAV值,只需一个symbol_header_id:
SET @quarterend = '2009-3-31';
SELECT symbol_header_id AS she, ADJ_NAV AS aend FROM symbol_details
WHERE
symbol_header_id = 18546
AND DATE= (
# date closest after quarter end
SELECT DATE FROM symbol_details
WHERE ABS(DATEDIFF(DATE, @quarterend)) < 10
AND DATE<=@quarterend
AND symbol_header_id = 18546
ORDER BY ABS(DATEDIFF(DATE, @quarterend)) ASC LIMIT 1)
当我运行内部“选择日期”查询时,它会快速返回。只运行填充了正确日期的外部查询而不是子查询也可以非常快速地完成。但是,当我运行整个事情时,它需要永远 - 有些事情是错的?
答案 0 :(得分:2)
似乎优化器在正确评估语句并找到最有效的计划方面存在一些问题。 (在Oracle中,我要求您更新统计信息,但我不确定优化器在MySQL中是如何工作的。)
我会尝试一些其他方式表达你的陈述,看看对优化器最有意义的是什么:
SELECT max(date) ..
而不是'按限制排序1'希望这里有一个有用的想法。
答案 1 :(得分:1)
你可以不用子查询。抓住第一行:
SELECT *
FROM symbol_details
WHERE DATE <= @quarterend
AND symbol_header_id = 18546
ORDER BY DATE DESC
LIMIT 1
答案 2 :(得分:1)
尝试:
SELECT t.symbol_header_id,
COALESCE(t.adj_nav, '0.0') 'adj_nav'
FROM SYMBOL_DETAILS t
LEFT JOIN (SELECT sh.symbol_header_id,
MAX(sh.date) 'max_date'
FROM SYMBOL_DETAILS sh
WHERE ABS(DATEDIFF(sh.date, @quarter_end)) < 10
AND sh.date <= @quarter_end) x ON x.symbol_header_id = t.symbol_header_id
AND x.max_date = t.date
WHERE t.symbol_header_id = 18546