Оптимизация MySQL левого соединения - PullRequest
0 голосов
/ 01 апреля 2020

Я не знаю, просто ли это желаемое, мое неправильное мышление или что-то еще:

select 
f1,
f2,
f3
from f_import as a
left join e_im_com_codes on a.customer = e_im_com_codes.customer 
and a.cc8 = e_im_com_codes.Code
where e_im_com_codes.Code is null
and a.customer = 'd'
and a.hide = false;

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

    +----+-------------+----------------+------------+------+--------------------------------------------+----------------+---------+-------+--------+----------+----------------------------------------------------+
| id | select_type | table          | partitions | type | possible_keys                              | key            | key_len | ref   | rows   | filtered | Extra                                              |
+----+-------------+----------------+------------+------+--------------------------------------------+----------------+---------+-------+--------+----------+----------------------------------------------------+
|  1 | SIMPLE      | f_import       | NULL       | ref  | idx_cc8_import,idx_com_code                | idx_cc8_import | 768     | const | 216782 |    10.00 | Using where                                        |
|  1 | SIMPLE      | e_im_com_codes | NULL       | ALL  | e_im_com_codes_idx,e_im_com_codes_customer | NULL           | NULL    | NULL  |   1698 |    10.00 | Using where; Using join buffer (Block Nested Loop) |
+----+-------------+----------------+------------+------+--------------------------------------------+----------------+---------+-------+--------+----------+----------------------------------------------------+

Но занимает около минуты, чтобы бежать.

Кто-нибудь получил какие-либо предложения относительно оптимизации на основе запросов? Или мне нужно немного переделать базу данных?

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Сначала вы должны добавить индексы в следующие столбцы:

f_import.customer 
f_import.cc8
f_import.customer
f_import.hide

e_im_com_codes.customer
e_im_com_codes.Code

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

0 голосов
/ 01 апреля 2020

Вместо этого вы можете попробовать not exists:

select i.f1, i.f2, i.f3
from f_import i
where i.customer = 'd' and
      i.hide = false and
      not exists (select 1
                  from e_im_com_codes icc
                  where i.customer = icc.customer and
                        i.cc8 = icc.Code
                 );

Затем для этого вам понадобится индекс для f_import(customer, hide) и e_im_com_codes(customer, code)

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