Должен ли я использовать подзапрос или комбинированный ГДЕ? - PullRequest
0 голосов
/ 05 июня 2019

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

CREATE TABLE schools (school_id int, name varchar(32), age ...);

Теперь я хочу найти ученика по его имени (например, «% name%»), но только если он находится в определенной школе. Я уже пробовал это:

SELECT * FROM `schools` WHERE `school_id` = 33 and `name` LIKE '%max%';

Но потом я понял, что могу также использовать такие подзапросы, как:

SELECT * FROM (SELECT * FROM `schools` WHERE `school_id` = 33) AS a
      WHERE a.name LIKE '%max%';

Какой способ более эффективен / имеет более высокую производительность?

Ответы [ 3 ]

2 голосов
/ 05 июня 2019

Вы можете использовать ключевое слово EXPLAIN, чтобы точно узнать, как выполняется каждый запрос.

Я бы сказал, что почти точно эти два будут выполняться одинаково.

1 голос
/ 05 июня 2019

Запрос без подзапроса, вероятно, более эффективен в MySQL:

SELECT *
FROM `schools`
WHERE `school_id` = 33 and `name` LIKE '%max%';

MySQL имеет эту неприятную тенденцию материализовать подзапросы, то есть фактически запускать подзапрос и сохранять его как временную таблицу (хотя она становится лучше). Большинство других баз данных не делают этого. Таким образом, в других базах данных они должны быть эквивалентны.

MySQL достаточно умен, чтобы использовать индекс, если он доступен, для school_id, хотя есть и другие сравнения. Если индексы недоступны, выполняется полное сканирование таблицы, что, вероятно, будет влиять на производительность.

1 голос
/ 05 июня 2019

Оптимизатор запросов, вероятно, выберет один и тот же план для обоих запросов. Если вы хотите знать наверняка, посмотрите на план выполнения при выполнении каждого запроса.

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