2009-04-19 3 views
2

Примечание. Это не проблема домашних заданий. Я изучаю dbms самостоятельно, поэтому эти домашние домашние вопросы.Эффективный SQL-запрос

две таблицы:

Teachers (teacher_id, teacher_name) 
Courses (teacher_id,course_id, course_name) 

Для того, чтобы выбрать имена учителей, которые не преподают никаких курсов, есть два запросы я могу думать:

mysql> explain select teacher_name from teachers left join courses on (teachers. 
teacher_id = courses.teacher_id) where course_id is null; 

mysql> explain select teacher_name from teachers where teacher_id not in (select 
teacher_id from courses); 

Какой будет более эффективным ? Зачем?

+0

Вам необходимо добавить TeacherID в таблицу курсов. –

ответ

-2

Я бы порекомендовал третий вариант - и это должно добавить отдельное предложение к вашему 2-му варианту и дать ему идти.

Я бы проголосовал за второй вариант как более эффективный (особенно с добавлением отдельной статьи). Вы, надеюсь, добавили индекс в teacher_id в обе таблицы.

Редактировать:
Я только что заметил, что это трюк - в курсах нет поля teacher_id.

Если несколько преподавателей могут преподавать курс - добавьте таблицу Teacher_Course (я всегда избегаю множественных чисел в именах объектов - просто практика). В этой новой таблице хранятся TeacherCourseId (сгенерированный системой идентификатор), course_id и teacher_id, и вы можете разрешить более одного учителя на класс.

0

Я думаю, что подзапросы (второй вариант в вашем случае) может работать быстрее, потому что они ограничивают количество возвращаемых строк, а также количество столбцов, возвращаемых. Первый вариант левого внешнего соединения может быть медленнее и интенсивнее. Но опять же, это может зависеть от нескольких других факторов, таких как количество возвращаемых строк, индексы на столбцах и т. Д.

0

Какой из них будет более эффективным?

Как всегда: это зависит от того, что находится в таблицах и что индексируется.

Обычно и по умолчанию соединение является предпочтительным для подзапроса. Он смотрит на каждого преподавателя, затем переходит непосредственно в таблицу курсов, чтобы найти соответствие для teacher_id. Надеемся, вы создадите индекс на «Courses.teacher_id», и это будет тривиально простой поиск.

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

Но в этом случае было бы лучше всего просто добавить индекс.

Смежные вопросы