Почему я присоединяюсь быстрее или? - PullRequest
0 голосов
/ 20 октября 2010

Я пытаюсь отфильтровать таблицу отношений, чтобы получить подмножество таблицы, в которой выполняются два условия (т.е. я хочу, чтобы все идентификаторы записей, color_ids которых равны 1 или 2).Это сложная таблица, поэтому я пытаюсь максимально оптимизировать ее.

Мне было интересно, кто-нибудь может объяснить мои выводы в этом случае:

Почему

SELECT DISTINCT a.id 
  FROM RelationshipTable as a 
  JOIN RelationshipTable as b ON b.id = a.id 
 WHERE a.color_id = 1 
   AND b.color_id = 2;

быстрее, чем

SELECT DISTINCT id 
  FROM RelationshipTable 
 WHERE color_id = 1 
    OR color_id = 2;

в MySql 4.1 ?

Ответы [ 2 ]

2 голосов
/ 20 октября 2010

Эти два запроса не совпадают и не должны давать одинаковый набор результатов. В первом запросе вам нужны все записи, которые удовлетворяют обоим условиям, у вас есть запись с color_id = 1 и запись с color_id 2 для того же идентификатора. Во втором запросе вы получите все записи, которые имеют и идентификаторы цвета, и все записи, которые имеют только одну или другую. Конечно, поскольку вы просите вернуть другое поле, вы можете этого не увидеть. И второй запрос в любом случае несколько глуп, так как он может быть выражен как:

select 1 as color id 
union all
select 2

И никогда не ударяется о стол вообще. Это сделало бы это очень быстро.

2 голосов
/ 20 октября 2010

Первый запрос невозможен и никогда не вернет набор результатов.Это в основном говорит: «Дайте мне все записи в таблице, где color_id равен 1, а color_id равен 2», что никогда не может произойти.

Если вы хотите спросить разницу между

SELECT DISTINCT a.id 
  FROM RelationshipTable as a 
  JOIN RelationshipTable as b ON b.id = a.id 
 WHERE a.color_id = 1 
   OR b.color_id = 2;

и

SELECT DISTINCT color_id 
  FROM RelationshipTable 
 WHERE color_id = 1 
    OR color_id = 2;

В этом случае первое всегда будет медленнее второго для больших таблиц.В первом случае выполняется полное сканирование таблицы A, а во втором - индексы, которые должны использоваться в предложении where.

...