解释计划需要很长时间

解释计划需要很长时间

问题描述:

我想弄清楚为什么查询需要这么久,所以我可以优化它。解释计划需要很长时间

我尝试了与讲解:

EXPLAIN SELECT * FROM (
SELECT p.*, ol. prod_id olpid 
FROM products p LEFT JOIN orderlines ol 
ON p. prod_id = ol. prod_id) pol 
WHERE pol. olpid IS NULL 
ORDER BY category , prod_id; 

当我在我的工作台运行它,我得到的错误代码为10分钟(600秒)后失去联系。当我在Prod_ID中设置Index后,查询在大概一秒钟内完成(完美),在此之前,几乎不可能得到答案。 另外EXPLAIN PLAN可以在几秒钟内执行它。 仍然我想使用索引在之前的查询上使用EXPLAIN。

这里的任何想法?

+0

您是否在产品或订单表上添加了索引? – Vinnie 2013-03-24 17:57:06

+0

即时将订单中的索引添加到product_ID中: ALTER TABLE orderlines add index PROD_ID(PROD_ID); – JOP 2013-03-24 18:06:42

这里你不需要子查询。使用此查询,而不是:

SELECT p.*, ol.prod_id olpid 
FROM products p LEFT JOIN orderlines ol 
ON p.prod_id = ol.prod_id 
WHERE ol.prod_id IS NULL 
ORDER BY category, prod_id; 

您最初的查询需要较长的时间来执行,因为你正在使用子查询。子查询需要完全执行,然后可以应用WHERE条件,并且最后记录被排序。这也是您的EXPLAIN查询速度很慢的原因。

+0

嗯我试过了,没有成功:错误代码:1054.'where子句'中的未知列'olpid' 即使我不需要subqery,我也想使用它。我读了解释计划不要跑过洞数据集。那为什么它不能在几秒内回答?希望你知道我的意思 – JOP 2013-03-24 18:06:04

+0

我更新了查询和我的答案。 – Jocelyn 2013-03-24 18:58:19

+0

谢谢,但仍然是一个错误:错误代码:1052.在where子句中的列'prod_id'是不明确的。 无论如何,感谢您的帮助,不幸的是我的主要问题是我如何运行EXPLAIN(我的mainquery)查询。几秒钟内答案不应该在那里吗?或者我错过了(查询应该保持1:1)thx – JOP 2013-03-24 19:30:19