Производительность запросов SQL варьируется, хотя они одинаковы - PullRequest
0 голосов
/ 13 июня 2018

Есть 2 таблицы и их структура, как показано ниже:

mysql> desc product;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |
| brand | varchar(20) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
2 rows in set (0.02 sec)


mysql> desc sales;
+-------------+-------------+------+-----+---------+-------+
| Field       | Type        | Null | Key | Default | Extra |
+-------------+-------------+------+-----+---------+-------+
| id          | int(11)     | YES  |     | NULL    |       |
| yearofsales | varchar(10) | YES  |     | NULL    |       |
| price       | int(11)     | YES  |     | NULL    |       |
+-------------+-------------+------+-----+---------+-------+
3 rows in set (0.01 sec)

Здесь id - внешний ключ.

И Запросы выглядят следующим образом:

1.

mysql> select brand,sum(price),yearofsales 
       from product p, sales s 
       where p.id=s.id 
       group by s.id,yearofsales;
+-------+------------+-------------+
| brand | sum(price) | yearofsales |
+-------+------------+-------------+
| Nike  |  917504000 | 2012        |
| FF    |  328990720 | 2010        |
| FF    |  328990720 | 2011        |
| FF    |  723517440 | 2012        |
+-------+------------+-------------+
4 rows in set (1.91 sec)

2.

mysql> select brand,tmp.yearofsales,tmp.sum 
       from product p 
       join (
           select id,yearofsales,sum(price) as sum
           from sales
           group by yearofsales,id
       ) tmp on p.id=tmp.id ;
+-------+-------------+-----------+
| brand | yearofsales | sum       |
+-------+-------------+-----------+
| Nike  | 2012        | 917504000 |
| FF    | 2011        | 328990720 |
| FF    | 2012        | 723517440 |
| FF    | 2010        | 328990720 |
+-------+-------------+-----------+
4 rows in set (1.59 sec)

Вопрос: почему второй запрос занимает меньше времени, чем первый?Я выполнил это несколько раз в другом порядке.

1 Ответ

0 голосов
/ 13 июня 2018

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

Однако настоятельно рекомендуется использовать явные объединения вместо неявных объединений:

SELECT brand, SUM(price), yearofsales
FROM product p
INNER JOIN sales s ON p.id = s.id
GROUP BY s.id, yearofsales;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...