Hallo Mark,
sehr gut vorbereitet. Dann fangen wir mal klein an:
1) mysql Parameter
Rick James says:
If using just MyISAM, set key_buffer_size to 20% of _available_ RAM.
| key_buffer_size | 268435456 | <== ist dies 20% des verfügbaren RAM?
2) Query DISTINCT
..
LEFT JOIN ( SELECT DISTINCT * FROM invoicelines) invoicelines
..
SELECT DISTINCT * FROM invoicelines liefert das gleiche Ergebnis wie
SELECT * FROM invoicelines, da mit
CREATE TABLE `invoicelines` (
`ID` int(16) NOT NULL AUTO_INCREMENT,
...
der eindeutige Key mit dabei ist und damit kann DISTINCT die Daten gar nicht verdichten. Eine Menge Rechenpower wird verblasen ohne Ergebnis.
Lösung => hier nur die wirklich notwendigen Spalten auflisten
..
LEFT JOIN ( SELECT DISTINCT ItemNrInt, x?, y? FROM invoicelines) invoicelines
..
4) Datentypen beachten.. aufwändiges Typcasting..
`PhysicalStock` ist VARCHAR, wird aber mit SUM() ausgewertet
CREATE TABLE `items_stock` (
...
`PhysicalStock` varchar(10) NOT NULL,
...
...
(SELECT SUM(its.PhysicalStock)
...
PhysicalStock sollte in einen numerischen Datentyp umgewandelt werden.
5) Bitte diesen Test-SQL ausführen und das Ergebnis zeigen..
Bevor ich ein paar Index Tipps gebe, brauche ich noch folgende Informationen.
SELECT MAX(LENGTH(brand)), MAX(LENGTH(attr_gender)) FROM items;
Bitte einen erneuten EXPLAIN liefern, wenn Du gemäß Punkt 1) bis 4) etwas geändert hast.
Grüße
Thomas