Эффективный SQL-запрос - PullRequest
       14

Эффективный SQL-запрос

2 голосов
/ 19 апреля 2009

Примечание: это не домашние проблемы. Я изучаю DBM самостоятельно, поэтому эти домашние вопросы.

Два стола:

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);

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

Ответы [ 4 ]

3 голосов
/ 19 апреля 2009

Объединение обычно выполняется быстрее, чем выборка.

http://www.codersrevolution.com/index.cfm/2008/7/31/MySQL-performance-INNER-JOIN-vs-subselect

0 голосов
/ 19 апреля 2009

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

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

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

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

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

0 голосов
/ 19 апреля 2009

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

0 голосов
/ 19 апреля 2009

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

Я бы проголосовал за 2-й вариант как более эффективный (особенно с добавлением отдельного предложения). Мы надеемся, что вы добавили индекс для teacher_id в обе таблицы.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...