(Возможно, дубликат, но я могу найти только вопросы и решения с РЕГИСТРИРУЙТЕСЬ [3]
и это не вариант.)Какой подзапрос работает быстрее?
У меня есть две таблицы. Оба очень тонкие (несколько столбцов) и очень длинны (много строк). Одна из них - таблица данных (articles
), а другая - таблица ACL (acl
).
Я хочу показать только те статьи, к которым у меня есть доступ, через acl.some_id
. Какой подзапрос работает быстрее?
[1]
SELECT a.title
FROM articles a
WHERE 0 < (
SELECT COUNT(1)
FROM acl
WHERE article_id = a.id AND some_id IN (1, 2, 3)
)
или
[2]
SELECT a.title
FROM articles a
WHERE a.id IN (
SELECT article_id
FROM acl WHERE some_id IN (1, 2, 3)
)
Мой разум сказал бы второй, потому что подзапрос может быть повторно использована для всех потенциально совпадающей строки, поэтому будет выполняться только один раз (хотя результирующий набор будет очень большой), тогда как подзапрос в первом должен будет проверять для КАЖДОЙ потенциально подходящей строки.
Там есть третий путь, но это не вариант, поскольку она будет дублировать строки (и GROUP BY не является решением, потому что мне нужно COUNT для чего-то еще позже (и DISTINCT никогда не решение!)):
[3]
SELECT a.title
FROM articles a
JOIN acl
ON acl.article_id = a.id
WHERE acl.some_id IN (1, 2, 3)
Поскольку article_id X существует N раз в acl
, было бы вернуть эту строку 0 - N раз вместо 0 - 1.
Там также четвертый путь: EXISTS
. Благодаря ypercube.
Похожие:
Вы написали код ... ** ПОПРОБУЙТЕ И И НАЙТИ! ** –
Попытка раз или 15 раз на самом деле ничего не значит. Я хочу, почему. И таблицы еще не длинны =), поэтому время выполнения будет очень, очень коротким. – Rudie
У mysql есть все инструменты, необходимые для ответа. Посмотрите план выполнения для каждого запроса. Просмотрите время выполнения. Вы можете сделать это. –