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
# User@Host: 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查询的输出)

表引文2

表检索

这是 EXPLAIN 的输出:

在此处输入图像描述

所以它似乎必须通过整个表......。我当然读过这个,但我无法理解它。那么,有没有办法让这个查询更快呢?

4

2 回答 2

2

试试这个查询

您正在利用短路,因此如果第一个条件为假,则不会检查第二个条件。

希望能帮助到你...

SELECT 
   text, 
   url, 
   docid 
FROM  
   retrieve 
LEFT JOIN 
   citations2 
ON 
   citations2.todoc IS NULL AND 
   citations2.fromdoc = retrieve.docid 
LIMIT 10;
于 2013-04-04T09:30:39.043 回答
1

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

IDX_FROMDOC_TODOC其中包含两列。

于 2013-04-04T09:40:00.993 回答