Hallo Mark,
ja sieht schwierig aus. Hast Du mal in letzter Zeit die beteiligten Tabellen mit ANALYZE und OPTIMIZE optimiert? Wenn nein, mal testen.
z. B.
mysql> ANALYZE TABLE items;
+------------+---------+----------+-----------------------------+
| Table | Op | Msg_type | Msg_text |
+------------+---------+----------+-----------------------------+
| test.items | analyze | status | Table is already up to date |
+------------+---------+----------+-----------------------------+
1 row in set (0.00 sec)
mysql> OPTIMIZE TABLE items;
+------------+----------+----------+-----------------------------+
| Table | Op | Msg_type | Msg_text |
+------------+----------+----------+-----------------------------+
| test.items | optimize | status | Table is already up to date |
+------------+----------+----------+-----------------------------+
1 row in set (0.00 sec)
mysql>
Nun noch mal eine Kardinalitätsabfrage
SELECT COUNT(DISTINCT attr_department),
COUNT(DISTINCT ItemNrInt),
COUNT(*)
FROM items;
und noch ein Test mit einem weiteren combined Index
ALTER TABLE items
DROP KEY attr_department,
ADD KEY idx_department_item_nr_brand (attr_department, `ItemNrInt`, `Brand` );
Jetzt bitte nochmal den kompletten Query mit einem Filter auf attr_department einen EXPLAIN ausführen und Query plus EXPLAIN hier zeigen.
Wenn dass nichts hilft mal folgende Radikallösung. Ein gigantischen Index auf invoicelines mit den fünf beteiligten Spalten aus dem "LEFT JOIN auf invoicelines". Ich versuche hiermit einen "Key-Only-Access", der Nachteil ist, dass ein INSERT, UPDATE, DELETE langsamer wird.
ALTER TABLE invoicelines
DROP KEY ItemNrInt,
ADD KEY idx_query_speep_up (ItemNrInt, OrderQty, FullPrice, OrderDate, ItemPriceNoVAT );
Jetzt bitte nochmal den kompletten Query mit einem Filter auf attr_department einen EXPLAIN ausführen und Query plus EXPLAIN hier zeigen.
Bis dahin..
Grüße
Thomas