У меня есть три таблицы с этими полями:

классы : class_id | имя | оценка

classes_students : class_id | Студенческий билет

студенты : student_id | имя

Классы имеют отношения n: m со студентами, поэтому в одном классе может быть много студентов, а один студент может слушать несколько классов. Я хочу выбрать всех учеников определенного класса, где class_id равен 5.

Вот три запроса, которые делают то же самое. Я использую последнюю версию MySQL, движок InnoDB. Какой из них покажет лучшую производительность и почему?

Запрос A)

SELECT s.name
  FROM students s
  JOIN classes_students cs ON cs.student_id = s.student_id AND cs.class_id = 5

Запрос Б)

SELECT s.name
  FROM students s
  JOIN classes_students cs ON cs.student_id = s.student_id
  JOIN classes c ON c.class_id = cs.class_id
 WHERE c.class_id = 5

Запрос C)

SELECT s.name 
 FROM students s 
 INNER JOIN classes_students cs ON cs.student_id = s.student_id
WHERE cs.class_id = 5
-1
openfrog 4 Янв 2010 в 12:54
Вероятно, не будет существенной разницы в плане запроса для предложенных запросов. Но C - наиболее естественный способ выразить то, что делает запрос; пойти с этим.
 – 
bobince
4 Янв 2010 в 13:12
Я отклонил этот вопрос. Настройка OP - это тест? Почему OP не сообщает нам, какой из них показывает лучшую производительность.
 – 
High Performance Mark
4 Янв 2010 в 13:47

2 ответа

Лучший ответ

MySQL предлагает инструкцию EXPLAIN который подробно расскажет вам о плане выполнения.

Я не запускал его, но держу пари, что три запроса обрабатываются точно так же.

Если вам действительно нужно настроить оптимизатор MySQL, вы можете взглянуть на STRAIGHT_JOIN, но MySQL в целом довольно умен.

1
Benoît Vidis 4 Янв 2010 в 13:43

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

Вообще говоря, предполагая, что все индексы на месте, я бы ожидал, что B будет худшим, поскольку в нем задействовано больше СОЕДИНЕНИЙ / больше таблиц. Я ожидал, что A и C будут одинаковыми (вероятно, будут оптимизированы для одного и того же плана выполнения)

3
AdaTheDev 4 Янв 2010 в 13:00