MySQL план выполнения отличается для левого и правого соединения - PullRequest
0 голосов
/ 30 сентября 2018

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

| panel_nowy | CREATE TABLE `pn` (
  `Miesiac` char(20) DEFAULT NULL,
  `kod_prod` int(11) DEFAULT NULL,
  `SKU` char(255) DEFAULT NULL,
  `Nazwa` char(80) DEFAULT NULL,
  `Molekula` char(255) DEFAULT NULL,
  `ATC4` char(20) DEFAULT NULL,
  `Kategoria_odplatnosci` char(20) DEFAULT NULL,
  `Specjalizacja` char(50) DEFAULT NULL,
  `Plec_pacjenta` char(20) DEFAULT NULL,
  `Wiek_pacjenta` char(20) DEFAULT NULL,
  `iloscopak` char(12) DEFAULT NULL,
  `Opakowania` double(20,3) DEFAULT NULL,
  `Recepty` double(20,3) DEFAULT NULL,
  `DDD` double(20,3) DEFAULT NULL,
  `SU` double(20,3) DEFAULT NULL,
  KEY `a` (`Miesiac`,`kod_prod`,`Specjalizacja`,`Wiek_pacjenta`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |

     panel_stary | CREATE TABLE `ps` (
  `Miesiac` char(20) DEFAULT NULL,
  `kod_prod` char(16) DEFAULT NULL,
  `SKU` char(255) DEFAULT NULL,
  `Nazwa` char(80) DEFAULT NULL,
  `Molekula` char(255) DEFAULT NULL,
  `ATC4` char(20) DEFAULT NULL,
  `Kategoria_odplatnosci` char(20) DEFAULT NULL,
  `Specjalizacja` char(50) DEFAULT NULL,
  `Plec_pacjenta` char(20) DEFAULT NULL,
  `Wiek_pacjenta` char(20) DEFAULT NULL,
  `iloscopak` char(12) DEFAULT NULL,
  `Opakowania` double(20,3) DEFAULT NULL,
  `Recepty` double(20,3) DEFAULT NULL,
  `DDD` double(20,3) DEFAULT NULL,
  `SU` double(20,3) DEFAULT NULL,
  KEY `a` (`Miesiac`,`kod_prod`,`Specjalizacja`,`Wiek_pacjenta`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 |


explain select s.Miesiac, s.kod_prod, s.SKU, s.Nazwa, s.Molekula, s.ATC4, left(s.ATC4,3) ATC2, left(s.ATC4,1) ATC1, s.Kategoria_odplatnosci, s.Specjalizacja, s.Plec_pacjenta, s.Wiek_pacjenta, s.iloscopak, s.Opakowania OpakowaniaS, s.Recepty ReceptyS, s.DDD DDDS, s.SU SUS, n.Opakowania OpakowaniaN, n.Recepty ReceptyN, n.DDD DDDN, n.SU SUN from jzs.ps s left join jzs.pn n using (Miesiac, kod_prod, Kategoria_odplatnosci, Specjalizacja, Plec_pacjenta, Wiek_pacjenta, iloscopak) where s.Miesiac='2018-08' ;

|id |select_type |стол |тип |возможные_ключи |ключ |key_len |ref |строки |Extra |

|1 |ПРОСТО |с |ref |а |а |21 |конст |1313241 |Использование где |

|1 |ПРОСТО |п |ref |а |а |98 |const, jzs.s.kod_prod, jzs.s.Specjalizacja, jzs.s.Wiek_pacjenta |2 ||

explain select n.Miesiac, n.kod_prod, n.SKU, n.Nazwa, n.Molekula, n.ATC4, left(n.ATC4,3) ATC2, left(n.ATC4,1) ATC1, n.Kategoria_odplatnosci, n.Specjalizacja, n.Plec_pacjenta, n.Wiek_pacjenta, n.iloscopak, s.Opakowania OpakowaniaS, s.Recepty ReceptyS, s.DDD DDDS, s.SU SUS, n.Opakowania OpakowaniaN, n.Recepty ReceptyN, n.DDD DDDN, n.SU SUN from jzs.ps s right join jzs.pn n using (Miesiac, kod_prod, Kategoria_odplatnosci, Specjalizacja, Plec_pacjenta, Wiek_pacjenta, iloscopak) where n.Miesiac= '2018-08' ;

|id |select_type |стол |тип |возможные_ключи |ключ |key_len |ref |строки |Extra |

|1 |ПРОСТО |п |ref |а |а |21 |конст |1093192 |Использование где |

|1 |ПРОСТО |с |ref |а |а |21 |конст |1313241 ||

...