2012-03-06 3 views
2

У меня есть запрос, который идет как это:MySQL LEFT JOIN и IS NULL

SELECT * 
FROM table_a 
LEFT JOIN table_b ON table_a.id_a = table_b.id_a 
WHERE 
table_b.field = 'something' OR table_b.field IS NULL 

я хочу иметь записи с table_b.field = «что-то» или те, где Тереза ​​нет записи в TABLE_B для строка в таблице_a. Когда я добавляю IS NULL, запрос занимает около 60 секунд, чтобы выполнить против 0,4 секунды без него.

любой может объяснить это поведение? Я думаю, что IS NULL отрицает некоторую оптимизацию, но я не совсем уверен.

ответ

1

У вас есть указатель на поле в Table_b? Если он находится в конкатенированном индексе, убедитесь, что он первый.

+0

Фактически ваше левое соединение гарантирует, что вы получите данные, когда они равны нулю. Вам нужно просто переместить table_b.field = 'something' в соединение. –

+0

На самом деле ваше левое соединение гарантирует, что вы получите данные, когда они равны нулю. Вам нужно просто переместить table_b.field = 'something' в соединение. SELECT * FROM TABLE_A LEFT JOIN TABLE_B ON table_a.id_a = table_b.id_a и table_b.field = 'что-то' –

+0

ну да, с индексом он восстанавливает скорость, но я до сих пор не понимаю, почему это происходит – Jarry