Оптимизация SQL-запросов с оператором NOT IN - PullRequest
0 голосов
/ 20 августа 2011

Пожалуйста, помогите мне оптимизировать этот запрос:

$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");

Спасибо.

Ответы [ 2 ]

2 голосов
/ 20 августа 2011

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

Очевидно, индексировать caseNumber для shipped_data и объединять для обоих.

0 голосов
/ 20 августа 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...