Наследуйтесь List< T> и переопределение Добавление () и AddRange () методы, чтобы сгенерировать событие?
Это зависит; запустите их обоих, чтобы узнать; затем запустите «выбор объяснения» для объяснения.
Фактическая разница в производительности может варьироваться от «практически не существует» до «довольно значительной» в зависимости от того, сколько строк в 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, кстати? Не числовой?), Ваше ВНУТРЕННЕЕ СОЕДИНЕНИЕ могло бы вести себя иначе (и стать быстрее). ВНУТРЕННЕЕ СОЕДИНЕНИЕ должно выполнить дополнительную проверку, чтобы удалить любые записи из A, которые не имеют совпадающих записей в B и C. В зависимости от количества записей, первоначально возвращенных из A, он МОЖЕТ иметь удар.
Используйте EXPLAIN , чтобы увидеть план запроса. Вероятно, это один и тот же план для обоих случаев, поэтому я сомневаюсь, что это имеет большое значение, если нет строк, которые не совпадают. Но это два разных запроса, поэтому сравнивать их действительно не имеет смысла - вы должны просто использовать правильный.
Почему бы не использовать ключевое слово «INNER JOIN» вместо «LEFT JOIN»?