Оставленное СОЕДИНЕНИЕ более быстрое или Внутреннее объединение быстрее?

Наследуйтесь List< T> и переопределение Добавление () и AddRange () методы, чтобы сгенерировать событие?

11
задан Murvinlai 27 November 2009 в 20:35
поделиться

3 ответа

Это зависит; запустите их обоих, чтобы узнать; затем запустите «выбор объяснения» для объяснения.

Фактическая разница в производительности может варьироваться от «практически не существует» до «довольно значительной» в зависимости от того, сколько строк в A с id = '12345' не имеют совпадающих записей в B и C.

Обновление (на основе опубликованных планов запросов)

Когда вы используете INNER JOIN, не имеет значения (по результатам, а не по производительности), с какой таблицы начать, поэтому оптимизатор пытается выбрать тот, который, по его мнению, будет работать лучше всего. Кажется, у вас есть индексы для всех соответствующих столбцов PK / FK, и у вас либо нет индекса для friend_events.userid , либо слишком много записей с userid = '13006' и он не используется; в любом случае оптимизатор выбирает таблицу с меньшим количеством строк в качестве «базовой» - в данном случае это zcms_users .

Когда вы используете LEFT JOIN, имеет значение (по результатам), какая таблица начать с; таким образом выбирается friend_events . Я не совсем уверен , почему таким образом требуется меньше времени; Я предполагаю, что условие friend_events.userid помогает. Если бы вы добавили к нему индекс (действительно ли это varchar, кстати? Не числовой?), Ваше ВНУТРЕННЕЕ СОЕДИНЕНИЕ могло бы вести себя иначе (и стать быстрее).

Я не совсем уверен, почему таким образом требуется меньше времени; Я предполагаю, что условие friend_events.userid помогает. Если бы вы добавили к нему индекс (действительно ли это varchar, кстати? Не числовой?), Ваше ВНУТРЕННЕЕ СОЕДИНЕНИЕ могло бы вести себя иначе (и стать быстрее).

Я не совсем уверен , почему таким образом требуется меньше времени; Полагаю, помогает условие friend_events.userid . Если бы вы добавили к нему индекс (действительно ли это varchar, кстати? Не числовой?), Ваше ВНУТРЕННЕЕ СОЕДИНЕНИЕ могло бы вести себя иначе (и стать быстрее).

9
ответ дан 3 December 2019 в 07:38
поделиться

ВНУТРЕННЕЕ СОЕДИНЕНИЕ должно выполнить дополнительную проверку, чтобы удалить любые записи из A, которые не имеют совпадающих записей в B и C. В зависимости от количества записей, первоначально возвращенных из A, он МОЖЕТ иметь удар.

4
ответ дан 3 December 2019 в 07:38
поделиться

Используйте EXPLAIN , чтобы увидеть план запроса. Вероятно, это один и тот же план для обоих случаев, поэтому я сомневаюсь, что это имеет большое значение, если нет строк, которые не совпадают. Но это два разных запроса, поэтому сравнивать их действительно не имеет смысла - вы должны просто использовать правильный.

Почему бы не использовать ключевое слово «INNER JOIN» вместо «LEFT JOIN»?

2
ответ дан 3 December 2019 в 07:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: