2013-04-04 148 views
2

这个非常简单的查询花费了大量的时间:我可以优化此查询吗?

SELECT text, url, docid 
FROM retrieve 
LEFT JOIN citations2 
ON citations2.fromdoc = retrieve.docid 
WHERE citations2.todoc IS NULL 
LIMIT 10; 

它有一个左连接用NULL条件......会是事业?我到处都有索引。

这里是慢查询日志:

# Time: 130404 8:00:31 
# [email protected]: em[em] @ zebra [130.239.162.142] 
# Query_time: 27.006579 Lock_time: 0.000019 Rows_sent: 0 Rows_examined: 90682 
use em_bg04; 
SET timestamp=1365055231; 
SELECT text, url, docid FROM retrieve LEFT JOIN citations2 ON citations2.fromdoc = retrieve.docid WHERE citations2.todoc IS NULL LIMIT 10; 

这里是涉及的表的示意图,与尺寸一起(保持向下滚动以查看的EXPLAIN输出为查询)

Table citations2

Table retrieve

这里的EXPLAIN输出:

enter image description here

如此看来,它要经过整个表...当然。我读this,但我无法理解它。那么,有没有办法让这个查询更快?

+0

尝试增加在'ON'子句where子句'选择文本,URL,docID的 FROM检索 LEFT JOIN citations2 ON citations2.todoc IS NULL AND citations2.fromdoc = retrieve.docid LIMIT 10;' – Meherzad 2013-04-04 09:26:03

+0

@Meherzad现在好多了!谢谢(如果您将您的评论复制到答案我会接受) – dsign 2013-04-04 09:29:31

回答

2

尝试此查询

你正在服用短路的优势,因此,如果第一个条件为假,它不会去检查第二个条件..

希望它可以帮助...

SELECT 
    text, 
    url, 
    docid 
FROM 
    retrieve 
LEFT JOIN 
    citations2 
ON 
    citations2.todoc IS NULL AND 
    citations2.fromdoc = retrieve.docid 
LIMIT 10; 
+0

当然有帮助!谢谢! – dsign 2013-04-04 09:40:19

+0

+1对我来说很好 – 2013-04-04 09:40:22

+0

很高兴能帮到.... :) – Meherzad 2013-04-04 09:45:08

1

Meherzads查询看起来很有希望。但我会用他的查询结合新创建的索引

IDX_FROMDOC_TODOC它包含两列。

+0

感谢您的建议。你认为优化器能够在查询中使用@Meherzad写的组合索引吗?我知道我应该尝试自己看看,但这意味着现在要停止一些事情:-( – dsign 2013-04-04 09:45:24

+0

我会尝试使用索引'todoc_fromdoc',以匹配列在测试中被检查的顺序。但是,有多少列有NULL'todoc',这可能根本无济于事。 – 2013-04-04 13:05:33