Einzelnen Beitrag anzeigen

Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#1

MySQL Tabelle flotter machen

  Alt 13. Jan 2012, 12:06
Datenbank: MySQL • Version: 4.1.9 • Zugriff über: UniDAC
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)
  Mit Zitat antworten Zitat