MySQL подвыбор производительности вопрос? - PullRequest
0 голосов
/ 04 декабря 2008

Мне нужен совет относительно производительности подвыбора в MySQL. По причине того, что я не могу измениться, я не могу использовать JOIN для создания фильтра запросов, я могу только добавить еще одно предложение AND в WHERE.

Какова производительность:

select tasks.*
from tasks
where 
  some criteria
  and task.project_id not in (select id from project where project.is_template = 1);

по сравнению с:

select tasks.*
from tasks, project
where
  some criteria
  and task.project_id = project.id and project.is_template <> 1;

Обратите внимание, что существует относительно небольшое количество проектов, когда is_template = 1, и может быть большое количество проектов, в которых is_template <> 1.

Есть ли другой способ достичь того же результата без подвыборов, если я не могу ничего изменить, кроме как и отфильтровать?

Ответы [ 4 ]

5 голосов
/ 04 декабря 2008

Я считаю, что второй более эффективен, поскольку требует только одного выбора, но чтобы быть уверенным, вы должны ОБЪЯСНИТЬ каждый запрос и проверить результаты.

EXPLAIN select tasks.*
from tasks
where 
  some criteria
  and task.project_id not in (select id from project where project.is_template = 1);

EXPLAIN select tasks.*
from tasks, project
where
  some criteria
  and task.project_id = project.id and project.is_template <> 1;
1 голос
/ 04 декабря 2008

Разница между этими двумя показателями может сильно зависеть от того, какие "некоторые критерии" существуют и какие возможности использовать индексы, которые он предоставляет. Но обратите внимание, что они не эквивалентны с точки зрения результатов, если есть задачи, у которых нет проектов. Второе эквивалентно этому:

select tasks.*
from tasks
where 
  some criteria
  and task.project_id in (select id from project where project.is_template <> 1);
0 голосов
/ 04 декабря 2008

Избегайте подзапросов вроде чумы в версиях MySQL <6.0, и я сомневаюсь, что вы используете 6.0, учитывая, что он все еще находится в альфа-фазе разработки. AFAIK, оптимизатор MySQL плохо обрабатывает подзапросы. Некоторая большая работа была проделана по модернизации оптимизатора для 6.0, и подзапросы теперь работают намного лучше, но эти изменения не просочились в серии 5.0 или 5.1. </p>

0 голосов
/ 04 декабря 2008

Я думаю, что первое может масштабироваться лучше:

Когда вы выполняете соединение, внутренне mysql создает своего рода временную таблицу, состоящую из двух таблиц, объединенных в соответствии с указанными условиями соединения. Вы не задаете условие соединения, поэтому оно создаст временную таблицу со всеми задачами, перечисленными для всех проектов. Я совершенно уверен (но проверяю с помощью инструмента объяснения), что он делает это до применения каких-либо предложений where.

Результат: если их 10, то будет 10 * 10 строк = 100. Вы можете видеть, как это становится больше с ростом чисел. Затем он применяет where к этой временной таблице.

Напротив, подзапрос выбирает только соответствующие строки из каждой таблицы.

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

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