Какой оператор SQL более эффективен? - PullRequest
1 голос
/ 18 ноября 2011

У меня есть таблицы в базе данных MySQL, как это ...

CREATE TABLE `someUserTable` 
(
userId INT NOT NULL,
.....
PRIMARY KEY(userId), 
);

CREATE TABLE `someActivityTable` 
(
activityId INT NOT NULL
userId INT,
.....
PRIMARY KEY(activityId),
KEY(userId) 
);

И если я хочу найти все действия для пользователя (скажем, «100»), будет ли оно более эффективным для

SELECT * 
FROM someUserTable U 
LEFT JOIN someActivityTable A ON A.userId = U.userId 
WHERE U.userId = 100;

или

SELECT * 
FROM someUserTable U 
LEFT JOIN 
(SELECT * FROM someActivityTable WHERE userId = 100) A ON A.userId = U.userId 
WHERE U.userId = 100;

----- ----- Edit

Использование профилировщика скажет мне, что лучше для текущей ситуации. Но меня интересует теория двух запросов.

Чтобы в будущем я мог знать, какой запрос лучше выполнять при разработке.

В противном случае мне нужно знать, пока приложение не будет запущено в производство и база данных не начнет заполняться, прежде чем я смогу выполнить точное профилирование. И к тому времени может быть уже слишком поздно.

Ответы [ 4 ]

2 голосов
/ 18 ноября 2011

Не существует такого понятия, как «самый эффективный» оператор, потому что

  1. Оптимизаторы запросов SQL функционируют как черные ящики, которые принимают решения на основе множества точек данных, решения, которые могут быть непредсказуемыми или даже явно непоследовательными.

  2. Наиболее эффективный оператор может меняться в зависимости от объема данных, наличия индексов и количества элементов этих индексов, так что этот «самый эффективный» выбор утра может не совпадать завтра для идентично структурированных таблиц.

В этом случае, однако, мы можем сказать, что версия 1 превосходит версию 2 в том, что она короче, проще для понимания и не содержит дублированной логики фильтрации. Придерживайтесь версии 1 до тех пор, пока вы не определите, что версия 2 - необходимый взлом производительности.

1 голос
/ 18 ноября 2011

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

До тех пор, пока не будет проблем с производительностью, делайте это просто и прямо. Если у вас есть проблемы с производительностью, пожалуйста, покажите нам объясните план и время, которое потребовалось для каждого утверждения.

Если вы действительно знаете о производительности в productoin, то вам нужно протестировать ее, прежде чем она будет запущена в производство. Вы можете выполнить профилирование перед запуском в производство с заполнением данных в тестовой системе.

С точки зрения разработчика, первое лучше, потому что оно не подвержено ошибкам, как второе утверждение, и более прямолинейно. Сохраняйте это простым!

1 голос
/ 18 ноября 2011

Я бы сказал, первый, но вы можете узнать с помощью профилировщика SQL.Если вы используете MS SQL, например, «SQL Server Profiler» поставляется с базой данных.

0 голосов
/ 18 ноября 2011

В зависимости от количества столбцов, которые есть у someActivityTable, он может быть первым, потому что во втором вы выбираете все данные:

SELECT * FROM someActivityTable WHERE userId = 100

Хотя это будет почти то же самое, что вы должны использоватьfirst один.

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