Mahlzeit zusammen. Wir haben bei einem Kunden Drucker an Waagen gegen ein
DB-Log getauscht, dass statt auf Papier die Ausgaben der Waagen protokolliert. Das landet alles in einer Tabelle, die mit einem kleinen Tool gefiltert und gedruckt werden kann. Mittlerweile sind dort so ca. 150k Datensätze aufgelaufen, und - nicht ganz unerwartet - wird das ganze langsamer. Leider stärker als erhofft, so dass ich jetzt nach Mitteln suche, meine Tabelle und Abfragen "aufzupeppen".
Die Tabelle:
Code:
CREATE TABLE `log` (
`id` int(10) unsigned NOT NULL auto_increment,
`machinenr` int(10) unsigned NOT NULL default '0',
`printerdate` datetime NOT NULL default '0000-00-00 00:00:00',
`packagenr` int(10) unsigned NOT NULL default '0',
`charge` int(10) unsigned NOT NULL default '0',
`prodname` varchar(255) NOT NULL default '',
`prodnr` varchar(10) NOT NULL default '',
`weight` decimal(10,2) NOT NULL default '0.00',
`rating` char(2) NOT NULL default '',
`deviation` decimal(10,2) NOT NULL default '0.00',
PRIMARY KEY (`id`))
ENGINE=InnoDB
DEFAULT CHARSET=latin1;
Die Selects dazu sehen alle in etwa so aus:
Code:
SELECT * FROM log
WHERE (printerdate BETWEEN :dts AND :dte)
ORDER BY printerdate, packagenr
Wobei es vier wählbare Sortierungen gibt, und es kann nach einzelnen Werten in "machinenr", "prodname", "prodnr" und "rating" gefiltert werden (entsprechende Anfügung (vorne) von "AND (field=:valueparam)" an den WHERE-Teil).
Die möglichen Sortierungen sind:
1) ORDER BY printerdate, packagenr
2) ORDER BY charge, packagenr, printerdate
3) ORDER BY prodname, printerdate, packagenr
4) ORDER BY prodnr, printerdate, packagenr
Erwarteterweise ist 3) mit Abstand das langsamte, doch auch die anderen sind zuweilen mit 5-10 Sekunden einfach zu lange unterwegs. Mit ist klar, dass die Tabelle alles andere als gut Indexiert ist, allerdings haben meine Versuche mit diversen Indizes auch nicht so viel verbessert - ich steck da einfach nicht tief genug drin.
Leider muss das große Textfeld "prodname" mitgeschlörrt werden, und um ein "SELECT *" komme ich auch nicht herum, da alle Felder in einem Grid angezeigt werden.
Daher meine Frage an die
DB-Experten hier: Gibt es zumindest schon mal irgend etwas offensichtliches, womit sich der arme Log-Ausdruck-Mitarbeiter etwas entnerven ließe?
Dankschö schon mal!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)