Tot op heden heeft de onderstaande query normaal gefunctioneerd, echter neemt deze nu bijna zo'n 3 minuten in.
Trim op a_reflev is nodig omdat de data die in deze tabel gedumped wordt standaard een X-aantal spaties bevat. Deze data is niet in eigen beheer dus valt niet op te lossen. Wanneer ik de tabel tijdelijk een update geef met trim(a_reflev) en deze vervolgens achterwege laat in de query maakt dit verder geen performance verschil.
Een explain geeft mij het volgende terug:
Dit is de structuur van de tabellen:
Indexes zijn toegevoegd aan a_reflev en product_id. De data verwerken vanuit twee aparte queries wordt vrijwel onmogelijk, PHP heeft het namelijk best zwaar om 17k rijen van artikeldata te verwerken. Heeft iemand nog tips om deze query te optimaliseren?
SQL:
1
2
3
4
5
6
7
8
9
| SELECT d.*, a.* FROM icecat_data d LEFT JOIN artikeldata.artikels a ON Trim(a.a_reflev) = d.product_id WHERE d.data IS NOT NULL AND d.invalid = 0 AND d.pending = 1 ORDER BY a.a_artstat DESC |
Trim op a_reflev is nodig omdat de data die in deze tabel gedumped wordt standaard een X-aantal spaties bevat. Deze data is niet in eigen beheer dus valt niet op te lossen. Wanneer ik de tabel tijdelijk een update geef met trim(a_reflev) en deze vervolgens achterwege laat in de query maakt dit verder geen performance verschil.
Een explain geeft mij het volgende terug:
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
1 | SIMPLE | d | ALL | NULL | NULL | NULL | NULL | 1400 | Using where; Using temporary; Using filesort |
1 | SIMPLE | a | ALL | NULL | NULL | NULL | NULL | 17415 |
Dit is de structuur van de tabellen:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| CREATE TABLE IF NOT EXISTS `icecat_data` ( `id` int(9) NOT NULL AUTO_INCREMENT, `date_created` datetime NOT NULL, `date_updated` datetime NOT NULL, `product_id` varchar(30) NOT NULL, `vendor` varchar(25) NOT NULL, `data` mediumtext, `pending` tinyint(1) NOT NULL DEFAULT '1', `invalid` tinyint(1) NOT NULL DEFAULT '0', `removed` tinyint(1) NOT NULL DEFAULT '0', PRIMARY KEY (`id`), UNIQUE KEY `product_id` (`product_id`,`vendor`), KEY `product_id_2` (`product_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; |
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
| CREATE TABLE IF NOT EXISTS `artikels` ( `a_stuknr` varchar(30) NOT NULL DEFAULT '0', `a_sorteer` float(8,3) NOT NULL, `a_lveld1` tinyint(1) NOT NULL DEFAULT '0', `e_lveld1` tinyint(1) NOT NULL DEFAULT '0', `a_lveld2` tinyint(1) NOT NULL DEFAULT '0', `a_lveld3` tinyint(1) NOT NULL DEFAULT '0', `a_lveld4` tinyint(1) NOT NULL DEFAULT '0', `a_type` varchar(20) NOT NULL DEFAULT '', `a_volgnr` varchar(20) NOT NULL DEFAULT '0', `a_nummer` varchar(20) NOT NULL DEFAULT '', `a_reflev` varchar(50) NOT NULL DEFAULT '', `a_folder` tinyint(1) NOT NULL DEFAULT '0', `a_fprijsd` float(8,3) NOT NULL DEFAULT '0.000', `a_fprijsm` float(8,3) NOT NULL DEFAULT '0.000', `a_fdatum` date NOT NULL DEFAULT '0000-00-00', `a_fvdatum` date NOT NULL DEFAULT '0000-00-00', `a_fprijsi` float(8,3) NOT NULL DEFAULT '0.000', `a_groep` char(3) NOT NULL DEFAULT '', `a_merkid` smallint(3) NOT NULL DEFAULT '0', `a_minverk` float(8,3) NOT NULL DEFAULT '0.000', `a_omschrn` varchar(250) NOT NULL DEFAULT '', `a_omschrf` varchar(200) NOT NULL DEFAULT '', `recupeurex` float(8,3) NOT NULL DEFAULT '0.000', `a_soort` char(3) NOT NULL DEFAULT '', `a_artstat` char(1) NOT NULL DEFAULT '', `a_instock` smallint(5) NOT NULL DEFAULT '0', `a_bokl` tinyint(5) NOT NULL DEFAULT '0', `a_bolv` tinyint(5) NOT NULL DEFAULT '0', `a_verdat` date NOT NULL DEFAULT '0000-00-00', `e_instock` smallint(5) NOT NULL, `e_bokl` tinyint(5) NOT NULL, `e_bolv` tinyint(5) NOT NULL, `g_bokl` tinyint(5) NOT NULL, `g_bolv` tinyint(5) NOT NULL, `g_verdat` date NOT NULL, `l_instock` smallint(5) NOT NULL, `l_bokl` tinyint(5) NOT NULL, `l_bolv` tinyint(5) NOT NULL, `l_verdat` date NOT NULL, `m_instock` smallint(5) NOT NULL, `m_bokl` tinyint(5) NOT NULL, `m_bolv` tinyint(5) NOT NULL, `m_verdat` date NOT NULL, `d_instock` smallint(5) NOT NULL, `d_bokl` tinyint(5) NOT NULL, `d_bolv` tinyint(5) NOT NULL, `d_verdat` date NOT NULL, `s_instock` smallint(5) NOT NULL, `s_bokl` tinyint(5) NOT NULL, `s_bolv` tinyint(5) NOT NULL, `s_verdat` date NOT NULL, `u_instock` smallint(5) NOT NULL, `u_bokl` tinyint(5) NOT NULL, `u_bolv` tinyint(5) NOT NULL, `u_verdat` date NOT NULL, `a_nomstock` smallint(5) NOT NULL DEFAULT '0', `a_aanbevol` float(8,3) NOT NULL DEFAULT '0.000', `a_basisex` float(8,3) NOT NULL DEFAULT '0.000', `a_dealer` float(8,3) NOT NULL DEFAULT '0.000', `a_winkel` float(8,3) NOT NULL DEFAULT '0.000', `a_winex` float(8,3) NOT NULL DEFAULT '0.000', `a_fprijs` float(8,3) NOT NULL DEFAULT '0.000', `a_btwcode` smallint(5) NOT NULL DEFAULT '0', `e_verdat` date NOT NULL, `g_instock` smallint(5) NOT NULL, `a_cveld6` char(20) DEFAULT NULL, `last_update_stock` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP, `last_update_article` datetime DEFAULT NULL, `Reprobelex` float(8,3) DEFAULT NULL, `Auvibelex` float(8,3) DEFAULT NULL, `Bebatex` float(8,3) DEFAULT NULL, `recupelex` float(8,3) DEFAULT NULL, `b_instock` smallint(5) NOT NULL, `b_bokl` tinyint(5) NOT NULL, `b_bolv` tinyint(5) NOT NULL, `b_verdat` date NOT NULL, `c_instock` smallint(5) NOT NULL, `c_bokl` tinyint(5) NOT NULL, `c_bolv` tinyint(5) NOT NULL, `c_verdat` date NOT NULL, `f_instock` smallint(5) NOT NULL, `f_bokl` tinyint(5) NOT NULL, `f_bolv` tinyint(5) NOT NULL, `f_verdat` date NOT NULL, `h_instock` smallint(5) NOT NULL, `h_bokl` tinyint(5) NOT NULL, `h_bolv` tinyint(5) NOT NULL, `h_verdat` date NOT NULL, PRIMARY KEY (`a_nummer`), KEY `a_groep` (`a_groep`), KEY `a_merkid` (`a_merkid`), KEY `a_soort` (`a_soort`), KEY `a_volgnr` (`a_volgnr`), KEY `a_reflev` (`a_reflev`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; |
Indexes zijn toegevoegd aan a_reflev en product_id. De data verwerken vanuit twee aparte queries wordt vrijwel onmogelijk, PHP heeft het namelijk best zwaar om 17k rijen van artikeldata te verwerken. Heeft iemand nog tips om deze query te optimaliseren?