2013-03-09 4 views
0

у меня есть две таблицы:MySQL LEFT JOIN vs. 2 отдельных запросов (производительность)

++++++++++++++++++++++++++++++++++++ 
|    Games    | 
++++++++++++++++++++++++++++++++++++ 
| ID | Name | Description  | 
++++++++++++++++++++++++++++++++++++ 
| 1 | Game 1 | A game description | 
| 2 | Game 2 | And another  | 
| 3 | Game 3 | And another  | 
| .. | ... |  ...   | 
++++++++++++++++++++++++++++++++++++ 

+++++++++++++++++++++++++++++++++++++++ 
|    GameReviews    | 
+++++++++++++++++++++++++++++++++++++++ 
| ID |GameID|   Review   | 
+++++++++++++++++++++++++++++++++++++++ 
| 1 | 1 |Review for game 1  | 
| 2 | 1 |Another review for game 1| 
| 3 | 1 |And another    | 
| .. | ... |   ...    | 
+++++++++++++++++++++++++++++++++++++++ 

Вариант 1:

SELECT 
    Games.ID, 
    Games.Name, 
    Games.Description, 
    GameReviews.ID, 
    GameReviews.Review 
FROM 
    GameReviews 
LEFT JOIN 
    Games 
ON 
    Games.ID = GameReviews.GameID 
WHERE 
    Games.ID=? 

Вариант 2:

SELECT 
    ID, 
    Name, 
    Description 
FROM 
    Games 
WHERE 
    ID=? 

, а затем ВЫБРАТЬ ID, Отзыв ОТ GameReviews ГДЕ GameID =?

Очевидно, что запрос 1 был бы «более простым», где меньше кода для записи, а другой, по-видимому, логически «проще» в базе данных, поскольку он запрашивает только таблицу Games. Вопрос в том, когда он действительно подходит к этому, действительно ли разница в производительности и эффективности?

ответ

1

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

Ваш пример также довольно простой. В масштабе проблемы производительности могут начать раскрываться, основываясь на том, какие поля фильтруются, объединяются и вытягиваются. Идеальный сценарий заключается в том, чтобы извлекать данные только в индексах (особенно в InnoDB). Это обычно невозможно, но стратегия заключается в том, чтобы вытащить фактические данные, которые вам нужны в последний момент. Какой вид какой вариант 2 будет делать.

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

1

Идите с опцией 1, это именно то, для чего оптимизированы RDBMS.
И всегда лучше удалять базу данных один раз от клиента, чем ударять ее несколько раз.

Я не верю, что вы когда-либо будет так много игр и обзоры, что это будет иметь смысл идти с опцией 2.

+0

Хотелось бы, чтобы я мог принимать оба ответа иногда ... – SnareChops

Смежные вопросы