Я часто желаю для записи SQL-запроса как следующее:
SELECT body
FROM node_revisions
where vid = (SELECT vid
FROM node
WHERE nid = 4);
Я знаю, что существуют соединения и наполняют Вас, мог сделать, но они, кажется, делают вещи более сложными. Действительно ли соединения являются лучшим способом сделать это? Действительно ли это более эффективно? Легче понять?
.
Тем не менее, производительность будет варьироваться от базы данных для базы данных, как таблицы структурированы, количество данных в них и сколько будет возвращено запросом.
Если сумма данных невелики, я бы использовал подзапрос, как ваш, а не присоединение.
Вот как будет выглядеть присоединение:
SELECT body
FROM node_revisions nr
INNER JOIN node n
ON nr.vid = n.vid
WHERE n.nid = 4
Я бы не использовал запрос, который вы разместили, так как есть шанс на более чем одного записи узла с помощью NID = 4
, что приведет к этому потерпеть неудачу.
Я бы использовал:
SELECT body
FROM node_revisions
WHERE vid IN (SELECT vid
FROM node
WHERE nid = 4);
Это более читаемый или понятный? В этом случае это вопрос личных предпочтений.
Я думаю, что присоединения легче понимать и могут быть более эффективными. Ваш корпус довольно прост, так что это, наверное, бросается. Вот как я бы написал это:
SELECT body
FROM node_revisions
inner join node
on (node_revisions.vid = node.vid)
WHERE node.nid = 4
Ответ на любые вопросы, связанные с производительностью в базах данных это зависит , и мы кратко по деталям в ОП. Зная особенности о вашей ситуации ... (Таким образом, это общие правила большого пальца)
Присоединения лучше и легче понять
Письменные запросы не имеют ничего общего с эффективностью *
Запросы, которые вы пишете, и то, что на самом деле становится бегическим Есть много способов написать запрос, но только так несколько способов получить данные, и это зависит от механизма запроса для решения. Это относится в основном к указателям. Очень можно написать четыре запроса, которые выглядят совершенно иначе, но внутренне делают то же самое.
(* можно написать ужасному запросу, которое неэффективно, но это требует особого рода сумасшедшего, чтобы сделать это.)
select
body
from node_revisions nr
join node n
on n.vid = nr.vid
where n.nid = 4
Присоединение интересно:
select body
from node_revisions nr
join node n on nr.vid = n.vid
where n.vid = 4
, но вы также можете выразить присоединение без присоединения [!]:
select body
from node_revisions nr, node n
where n.nid = 4 and nr.vid = n.vid
Достаточно интересно, SQL Server дает небольшой другой план запроса на обоих запросах, а присоединение имеет кластерный индекс Сканирование, «Присоединение без присоединения» имеет кластерный индекс ищет в его месте, что указывает на это лучше , по крайней мере, в этом случае!
select
body
from node_revisions A
where exists (select 'x'
from Node B
Where A.Vid = B.Vid and B.NID=4)
Я не вижу ничего плохого в том, что вы написали, и хороший оптимизатор может даже изменить его в присоединение, если он видит в форме.
Последний код MySQL 6.x будет автоматически Преобразуйте, что в выражении в внутреннее соединение с использованием полуприменения оптимизация подзасоединения , делая 2 заявления в значительной степени эквивалентной:
http://forge.mysql.com/worklog/task.php?id= 3740
Но на самом деле написание его довольно просто сделать, потому что внутреннее присоединение - это тип присоединения по умолчанию, и делает это не полагается на сервер, оптимизирующий его (который может принять решение не по какой-то причине, и который не будет портативным обязательно). Все равно равны, почему бы не пойти с:
select body from node_revisions r, node n where r.vid = n.vid and n.node = 4
SELECT body
FROM node_revisions
WHERE vid =
(
SELECT vid
FROM node
WHERE nid = 4
)
Этот запрос логически эквивалентен присоединению, если и только тогда, когда NID
является первичным ключом
или покрывается уникальным
ограничением .
В противном случае запросы не эквивалентны: присоединение всегда будет успешным, в то время как подзапрос не удастся, если будет больше, что 1
ряд в Node
с NID = 4
.
Если NID
представляет собой первичный ключ
, то соединение
и подзапрос будет иметь ту же производительность.
В случае соединения узел
будет произведен ведущий
в случае подзапроса, подзапрос будет выполнен один раз и преобразован в const
на стадии разбора.