У меня есть три таблицы с этими полями:
классы : 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
2 ответа
MySQL предлагает инструкцию EXPLAIN который подробно расскажет вам о плане выполнения.
Я не запускал его, но держу пари, что три запроса обрабатываются точно так же.
Если вам действительно нужно настроить оптимизатор MySQL, вы можете взглянуть на STRAIGHT_JOIN, но MySQL в целом довольно умен.
Единственный верный способ узнать - попробовать их все и сравнить производительность в вашей среде. Всегда проверяйте запросы в своей среде, сравнивайте их, чтобы увидеть, что на самом деле работает лучше всего, иначе вы никогда не узнаете.
Вообще говоря, предполагая, что все индексы на месте, я бы ожидал, что B будет худшим, поскольку в нем задействовано больше СОЕДИНЕНИЙ / больше таблиц. Я ожидал, что A и C будут одинаковыми (вероятно, будут оптимизированы для одного и того же плана выполнения)
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.