Mark Knochen Wrote:
-------------------------------------------------------
>
|
+----+--------------------+--------------+------+---------------+-------------+---------+--------------------------------+--------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key |key_len | ref | rows | Extra |
+----+--------------------+--------------+------+---------------+-------------+---------+--------------------------------+--------+----------------------------------------------+
| 1 | PRIMARY | items | ref | attr_gender | attr_gender | 12 | const | 8316 | Using where; Using temporary; Using filesort |
| 1 | PRIMARY | <derived3> | ALL | NULL | NULL | NULL | NULL | 39613 | |
| 3 | DERIVED | invoicelines | ALL | NULL | NULL | NULL | NULL | 549572 | Using temporary |
| 2 | DEPENDENT SUBQUERY | its | ref | ItemNrInt | ItemNrInt | 4 | reporting_test.items.ItemNrInt | 8 | |
+----+--------------------+--------------+------+---------------+-------------+---------+--------------------------------+--------+----------------------------------------------+
>
Die Performancebremse ist hier ganz klar der SELECT auf die Tabelle invoicelines. Hier muss die komplette Tabelle (immerhin 549572 Row * durchschnittlich 245Byte = ca. 130MB ) gelesen werden und per GROUP verdichtet. Das ist zeitaufwändig. Besteht hier die Möglichkeit auf eine bestimmte "Rechnungsart" einzuschränken? Dann wäre schon viel gewonnen.
>
> SELECT ItemNrInt, OrderQty, FullPrice, OrderDate,
> ItemPriceNoVAT,
> STATUS
> FROM invoicelines
> GROUP BY ItemNrInt
> ORDER BY NULL
> )invoicelines ON ( invoicelines.ItemNrInt =
Hier verwendet Du wieder den GROUP BY ohne MAX(). So gibt es eventuell zufällige Ergebnisse wie wir gelernt haben.
Zwei Fragen noch:
a) Kannst Du noch mal dies ausführen und zeigen
mysql>SHOW CREATE TABLE items;
b) Für die Kardinalität mal dies ausführen und zeigen
SELECT COUNT(DISTINCT items.attr_gender), COUNT( DISTINCT items.Brand)
FROM items;
Grüße
Thomas