Hallo Mark,
diese zwei Spalten sind meiner Meinung nach vollkommen überdimensioniert.
CREATE TABLE `items` (
[...]
`Brand` varchar(255) NOT NULL,
[...]
`attr_gender` varchar(100) NOT NULL,
[...]
KEY `Brand` (`Brand`),
[...]
wirklich benötigt wird nur dieser Größe:
SELECT MAX(LENGTH(brand)), MAX(LENGTH(attr_gender)) FROM items;
+--------------------+--------------------------+
| MAX(LENGTH(brand)) | MAX(LENGTH(attr_gender)) |
+--------------------+--------------------------+
| 57 | 1 |
+--------------------+--------------------------+
deshalb würde ich diese zwei Spalten in etwa so kürzen und einen combined index darüber legen:
ALTER TABLE items
MODIFY brand VARCHAR(80) NOT NULL,
MODIFY attr_gender VARCHAR(10) NOT NULL;
ALTER TABLE items
DROP KEY brand,
ADD KEY idx_brand_gender (brand, attr_gender);
Jetzt bitte nochmal den Query mit EXPLAIN ausführen.
EXPLAIN SELECT items.Brand,
SUM(
(SELECT SUM(its.PhysicalStock)
FROM items_stock AS its
WHERE its.ItemNrInt = items.ItemNrInt
)
) AS stockValue
FROM items
LEFT JOIN ( SELECT ItemNrInt,MAX(OrderQty),MAX(FullPrice),MAX(OrderDate),MAX(ItemPriceNoVAT),MAX(Status)
FROM invoicelines
GROUP BY ItemNrInt
ORDER BY NULL ) invoicelines
ON (invoicelines.ItemNrInt = items.ItemNrInt)
WHERE items.attr_gender = '8'
GROUP BY items.Brand;
Grüße
Thomas