ПРИСОЕДИНЯЙТЕСЬ к данным о местоположении или поместите их в предложение where? - PullRequest
1 голос
/ 21 сентября 2009

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

Таблица, к которой я пытаюсь присоединиться, выглядит следующим образом (другие таблицы уже есть в запросе).

vid             kid         uid
1                34          12
1                34          15
2                22          18
2                34          18
2                22          15

Мой запрос такой

SELECT * FROM similar 
RIGHT OUTER JOIN(SELECT event.stuff,  eventdate.stuffshows
FROM events
JOIN evendate ON events.eid=eventdate.eid
WHERE location= 'Paris'
AND event.date
BETWEEN '2009-08-14'
AND '2009-08-17'
GROUP BY event.date
ORDER BY event.date
LIMIT 0 , 5
) mystuff ON event.bid = similar.id
AND event.date=similar.date

Я думаю, что смогу сделать это

SELECT * FROM similar 
RIGHT OUTER JOIN(SELECT event.stuff,  eventdate.stuffshows
FROM events
JOIN evendate ON events.eid=eventdate.eid
WHERE 
user.vid=events.vid AND user.uid=15 AND user.kid=22
location= 'Paris'
AND event.date
BETWEEN '2009-08-14'
AND '2009-08-17'
GROUP BY event.date
ORDER BY event.date
LIMIT 0 , 5
) mystuff ON event.bid = similar.id
AND event.date=similar.date

Меня беспокоит то, что я как бы смешиваю соединение с "где". Стоит ли для производительности установить второе JOIN для user.vid = events.vid? Или лучше сделать ГДЕ, чем объединение?

Есть предложения по этому поводу?

Ответы [ 3 ]

3 голосов
/ 21 сентября 2009

Если вас интересуют различия в производительности, самый простой способ выяснить это - предвосхитить ваши операторы SELECT с помощью EXPLAIN. Вы увидите, какие индексы используются, сколько строк нужно коснуться и т. Д.

0 голосов
/ 25 июля 2013

Просто чтобы прямо ответить на этот вопрос. Размещение ограничений в предложениях where или on не имеет значения в долгосрочной перспективе. mySQL оптимизирует их оба для эффективного выполнения одного и того же запроса (который, как объясняет dnagirl, вы можете увидеть с помощью EXPLAIN). Такой инструмент, как mysql workbench, может показать вам относительное время, необходимое для выполнения запроса, что также поможет ответить на подобные вопросы. Для этого конкретного вопроса, поскольку запросы в основном эквивалентны, вы можете использовать предложение Джея и просто выбрать тот, который, по вашему мнению, делает вещи более читабельными.

0 голосов
/ 21 сентября 2009

Если вы просто ищете эмпирическое правило, а производительность эквивалентна, я использую то, что делает его наиболее логичным для моего понимания. Я поместил поля, которые определяют соединение между двумя таблицами в предложении соединения, и условия фильтрации в предложении where. Как правило, вы знаете, что у вас все правильно, если вы пишете аналогичный запрос, и условия соединения остаются прежними, и изменяется только условие where.

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