Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 带有NOT IN语句的SQL查询优化_Mysql_Sql - Fatal编程技术网

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,我按照您上面提到的更新了索引。。谢谢,它工作得很好,速度更快。。请解释索引是如何工作的。索引是快捷方式,可以让您的查询运行得更快。可以将它们看作是非常快速的查找表,因为可以将所有列作为索引。如何选择要编制索引的列。注释中没有足够的空间来真正解决这个问题。