Mysql 带有NOT IN语句的SQL查询优化
请帮助我优化此查询:Mysql 带有NOT IN语句的SQL查询优化,mysql,sql,Mysql,Sql,请帮助我优化此查询: $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')
$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");
谢谢
DISTINCT
意味着对于添加到结果集中的每个记录,MySQL必须在添加记录之前检查整个集合是否存在。这意味着它要插入一个O(n^2)。在in
子句中使用它时,这可能意味着您正在为零效益添加更多的工作。请尝试以下方法:
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
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
显然,在已装运的数据上索引caseNumber,在两者上都索引bay。代码在哪里“最后是从哪里来的?亲爱的cWallenpole,我按照您上面提到的更新了索引。。谢谢,它工作得很好,速度更快。。请解释索引是如何工作的。索引是快捷方式,可以让您的查询运行得更快。可以将它们看作是非常快速的查找表,因为可以将所有列作为索引。如何选择要编制索引的列。注释中没有足够的空间来真正解决这个问题。