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