powered by simpleCommunicator - 2.0.50     © 2025 Programmizd 02
Форумы / MySQL [игнор отключен] [закрыт для гостей] / MySQL 8.0 драматически изменил план запроса
2 сообщений из 2, страница 1 из 1
MySQL 8.0 драматически изменил план запроса
    #40028245
kestrel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Percona Server for MySQL 8.0.21-12.2
По сравнению с 5.7 план запроса кардинально испортился.
Путём последовательных упрощений удалось определить, в каком месте это происходит.
Вот этот запрос имеет нормальный план:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
SELECT  ul1_.ОГРН  ogrn__
FROM  свюл  ul1_,
  (SELECT ul2_.ИНН inn_
   FROM   свюл ul2_
   WHERE (ul2_.ОГРН  = 1001601569991 or ul2_.ИНН = '1643005102' and ('164301001' = '' or ul2_.КПП = '164301001'))
   GROUP BY  ul2_.ИНН ) AS ls_
WHERE ul1_.ИНН IN (ls_.inn_)
  AND ul1_.ОГРН NOT IN 
    (SELECT vs1_.ОГРН
     FROM видзап vs1_
     WHERE vs1_.ОГРН IN 
       (SELECT ОГРН FROM свюл WHERE ИНН IN (ls_.inn_))
       AND  vs1_.КодСПВЗ IN (SELECT код FROM ЛиквидКоды))
GROUP BY ul1_.ОГРН;


Вот план (столбец partititions убрал, т.к. везде NULL):
Код: plaintext
1.
2.
3.
4.
5.
6.
id select_type table      type        possible_keys               key             key_len ref                rows filtered Extra
1  PRIMARY     <derived2> ALL         NULL                        NULL            NULL    NULL               2    100.00   Using where; Using temporary
1  PRIMARY     ul1_       ref         PRIMARY,Key_inn,key_inn_kpp key_inn_kpp     43      ls_.inn_           1    100.00   Using index
1  PRIMARY     свюл       eq_ref      PRIMARY,Key_inn,key_inn_kpp PRIMARY         8       egrul.ul1_.ОГРН    1    100.00   Using where; Not exists
1  PRIMARY     vs1_       ref         Index2                      Index2          8       egrul.свюл.ОГРН    7    100.00   Using where
1  PRIMARY     ЛиквидКоды ref         Индекс 1                    Индекс 1        4       egrul.vs1_.КодСПВЗ 1    100.00   Using where; Using index
2  DERIVED     ul2_       index_merge PRIMARY,Key_inn,key_inn_kpp PRIMARY,Key_inn 8,43    NULL               2    100.00   Using union(PRIMARY,Key_inn); Using where; Using temporary

Теперь берём этот запрос в качестве подзапроса, и план портится:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
SELECT ul_.ОГРН
FROM свюл ul_
WHERE ul_.`ОГРН` IN
 (SELECT  ul1_.ОГРН  ogrn__
  FROM  свюл  ul1_,
    (SELECT ul2_.ИНН inn_
     FROM   свюл ul2_
     WHERE (ul2_.ОГРН  = 1001601569991 or ul2_.ИНН = '1643005102' and ('164301001' = '' or ul2_.КПП = '164301001'))
     GROUP BY  ul2_.ИНН ) AS ls_
  WHERE ul1_.ИНН IN (ls_.inn_)
    AND ul1_.ОГРН NOT IN 
      (SELECT vs1_.ОГРН
       FROM видзап vs1_
       WHERE vs1_.ОГРН IN 
         (SELECT ОГРН FROM свюл WHERE ИНН IN (ls_.inn_))
         AND  vs1_.КодСПВЗ IN (SELECT код FROM ЛиквидКоды))
  GROUP BY ul1_.ОГРН);


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
id select_type table      type        possible_keys               key             key_len ref                rows     filtered Extra
1  PRIMARY     ul_        index       NULL                        Key_inn         43      NULL               10453894 100.00   Using where; Using index
2  SUBQUERY    <derived3> ALL         NULL                        NULL            NULL    NULL               2        100.00   Using where
2  SUBQUERY    ul1_       ref         PRIMARY,Key_inn,key_inn_kpp key_inn_kpp     43      ls_.inn_           1        100.00   Using index
2  SUBQUERY    свюл       eq_ref      PRIMARY,Key_inn,key_inn_kpp PRIMARY         8       egrul.ul1_.ОГРН    1        100.00   Using where; Not exists
2  SUBQUERY    vs1_       ref         Index2                      Index2          8       egrul.ul1_.ОГРН    7        100.00   NULL
2  SUBQUERY    ЛиквидКоды ref         Индекс 1                    Индекс 1        4       egrul.vs1_.КодСПВЗ 1        100.00   Using where; Using index
3  DERIVED     ul2_       index_merge PRIMARY,Key_inn,key_inn_kpp PRIMARY,Key_inn 8,43    NULL               2        100.00   Using union(PRIMARY,Key_inn); Using where; Using temporary

Подозреваю, что дело в каком-то пустяке, но не могу докопаться, в каком.
...
Рейтинг: 0 / 0
MySQL 8.0 драматически изменил план запроса
    #40028588
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kestrel
и план портится

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

Другое дело, что Вы используете WHERE IN - а это наихудший из вариантов отбора пересечения. Перепишите все WHERE IN на INNER JOIN или на WHERE EXISTS - в зависимости от статистики подзапроса и внешней таблицы.
...
Рейтинг: 0 / 0
2 сообщений из 2, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / MySQL 8.0 драматически изменил план запроса
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]