左右连接的MySQL执行计划不同

时间:2018-09-30 02:39:12

标签: mysql join sql-execution-plan

我正在模拟完全连接,方法是先进行左连接,然后进行右连接,其中“左表连接列为null”。 问题:我得到了不同的执行计划-右联接明显变慢,我希望它与左联接计划一样好。 我知道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 |参考|行|额外|

| 1 |简单s |参考|一个|一个| 21 | const | 1313241 |在哪里|

| 1 |简单n |参考|一个|一个| 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 |参考|行|额外|

| 1 |简单n |参考|一个|一个| 21 | const | 1093192 |在哪里|

| 1 |简单s |参考|一个|一个| 21 | const | 1313241 | |

0 个答案:

没有答案