2011-08-20 129 views
0

请帮我优化这个查询:SQL查询优化与NOT IN语句

$result = mysql_query(' 
SELECT DISTINCT caseNumber 
FROM master_break 
WHERE invoiceNumber='$invoice' 
AND bay='$bay' AND caseNumber 
NOT IN(SELECT DISTINCT caseNumber 
     FROM shipped_data 
     WHERE status='' AND bay='$bay') 
     ORDER BY caseNumber ASC"); 

感谢。

+0

'''最后来自哪里? – Amy

回答

2

DISTINCT意味着对于每个记录添加到结果集,MySQL有添加记录之前检查其存在的整个集合。这意味着它有一个O(n^2)来插入。当在IN条款中使用它时,这可能意味着您要增加更多的工作以实现零收益。试试这个代替:

SELECT DISTINCT caseNumber 
FROM master_break 
WHERE invoiceNumber='$invoice' 
AND bay='$bay' 
AND caseNumber NOT IN( 
    SELECT caseNumber 
    FROM shipped_data 
    WHERE status='' AND bay='$bay') 
ORDER BY caseNumber ASC 

显然索引case_Number on shipped_data和bay两者。

+0

亲爱的cwallenpoole,我更新了上面提到的索引..感谢它工作正常,速度更快..请解释索引在这里工作的方式 –

+0

索引是快捷方式让您的查询运行得更快,将它们视为真正的快速查找表 – cwallenpoole

+0

可以将所有列作为索引,我如何选择列进行索引 –

0
SELECT DISTINCT caseNumber 
FROM master_break 
LEFT JOIN shipped_data ON master_break.caseNumber = shipped_data.caseNumber 
WHERE invoiceNumber='$invoice' 
    AND master_break.bay='$bay' 
    AND shipped_data.status !='' 
    AND shipped_data.bay !='$bay' 
ORDER BY caseNumber ASC