Как оптимизировать mysql равный запрос на соединение по скорости? - PullRequest
0 голосов
/ 18 марта 2020

У меня есть таблица с примерами загрузки в Dropbox.
загрузка в mysql с балансом имени таблицы
загрузка в mysql с доходом по имени таблицы
Показать структуру данных:

describe balance;
+----------------------+--------+------+-----+---------+-------+
| Field                | Type   | Null | Key | Default | Extra |
+----------------------+--------+------+-----+---------+-------+
| code                 | text   | YES  |     | NULL    |       |
| report_date          | date   | YES  |     | NULL    |       |
| total_assets         | double | YES  |     | NULL    |       |
| total_owner_equities | double | YES  |     | NULL    |       |
+----------------------+--------+------+-----+---------+-------+
4 rows in set (0.00 sec)

describe income;
+--------------------------+--------+------+-----+---------+-------+
| Field                    | Type   | Null | Key | Default | Extra |
+--------------------------+--------+------+-----+---------+-------+
| code                     | text   | YES  |     | NULL    |       |
| report_date              | date   | YES  |     | NULL    |       |
| total_operating_revenue  | double | YES  |     | NULL    |       |
| net_profit               | double | YES  |     | NULL    |       |
| np_parent_company_owners | double | YES  |     | NULL    |       |
+--------------------------+--------+------+-----+---------+-------+
5 rows in set (0.01 sec)

В обеих таблицах содержится небольшая запись.

select count(*) from income;
+----------+
| count(*) |
+----------+
|    51250 |
+----------+
1 row in set (0.06 sec)

select count(*) from balance;
+----------+
| count(*) |
+----------+
|    50832 |
+----------+
1 row in set (0.05 sec)

Для выполнения запроса равного соединения требуется еще 4 минуты.

select a.code ,a.report_date ,a.total_assets ,a.total_owner_equities,  
       b.total_operating_revenue,b.net_profit ,b.np_parent_company_owners 
       from balance as a ,income  as b          
       where   a.code=b.code and a.report_date=b.report_date;


50793 rows in set (4 min 5.15 sec)

Как оптимизировать mysql равный запрос соединения для скорости в этом случае?

Ответы [ 2 ]

0 голосов
/ 18 марта 2020

Для повышения производительности запросов вам необходимо внести в таблицы несколько изменений:

  1. Не использовать текстовые поля, если в этом нет необходимости. Таким образом, я имею в виду поле code можно изменить на VARCHAR вместо TEXT
  2. Добавить индекс для полей, используемых в соединениях.

Итак, вам нужно:

ALTER TABLE `TableA` 
CHANGE `code` VARCHAR(256),
ADD INDEX `code_idx` (`code`),
ADD INDEX `report_date_idx` (`report_date`);

ALTER TABLE `TableB` 
CHANGE `code` VARCHAR(256),
ADD INDEX `code_idx` (`code`),
ADD INDEX `report_date_idx` (`report_date`);
0 голосов
/ 18 марта 2020

Объяснение

Причина, по которой запрос занимает так много времени, заключается в том, что он пытается сопоставить каждую запись в первой таблице с каждой записью во второй таблице. 51 250 * 50 832 = 2 605 140 000 проверок.

Сокращая диапазон, вы можете значительно увеличить скорость запроса.


Код

select a.code ,a.report_date ,a.total_assets ,a.total_owner_equities,  
       b.total_operating_revenue,b.net_profit ,b.np_parent_company_owners 
       from balance as a ,income  as b          
       where   a.code=b.code and a.report_date=b.report_date
       and a.report_date between date1 and date2
       and b.report_date between samedate1 and samedate2;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...