Performance-Überlegungen und Indizes [Mysql 5.0]

Hallo,

ich hoste und programmiere zur Zeit ein IRC-Logger mit den zugehörigen CGI-Skripten, um die Daten online anzuzeigen. Seit ich vor kurzem alte Logs importiert habe, komme ich auf etwa eine Million Zeilen, und damit wird die Datenbank relativ langsam (sprich: es gibt eine spürbare Verzögerung im Seitenaufbau).

Die Tabelle sieht bisher so aus:

mysql\> describe irclog;
+-----------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto\_increment | 
| channel | varchar(30) | YES | | NULL | | 
| day | char(10) | YES | | NULL | | 
| nick | varchar(40) | YES | | NULL | | 
| timestamp | int(11) | YES | | NULL | | 
| line | text | YES | | NULL | | 
| spam | tinyint(1) | YES | | 0 | | 
+-----------+-------------+------+-----+---------+----------------+
7 rows in set (0.14 sec)

channel ist der IRC-Channel (und es wird immer nur einer gleichzeitig dargestellt, d.h. alle Abfragen haben ein ‚WHERE channel = ?‘ drin), day der Tag im Format ‚YYYY-MM-DD‘ (der ebenfalls fast immer abgefragt wird), der Rest dürfte selbsterklärend sein.

Jetzt ist meine Frage: Wie kann ich das effizienter machen?
Ich kenne mich nicht so gut mit Indizes aus: reicht es, einen Index über der Spalte day zu errichten, um die Abragen zu beschleunigen? Oder hilft das nur bei Volltextsuche?

Ansonsten habe ich mir noch folgendes überlegt:

  1. Ich könnte die Daten für jeden Channel in eine eigene Tabelle packen
  2. Ich könnte day durch einen Integer ersetzen und in den CGI-Scripten ins Datum umwandeln
    Würde das die Abfragen tatsächlich beschleunigen?

Über Kommentare oder Tipps würde ich mich freuen.

Grüße,
Moritz

Hallo Moritz,

ich hoste und programmiere zur Zeit ein IRC-Logger mit den
zugehörigen CGI-Skripten, um die Daten online anzuzeigen. Seit
ich vor kurzem alte Logs importiert habe, komme ich auf etwa
eine Million Zeilen, und damit wird die Datenbank relativ
langsam (sprich: es gibt eine spürbare Verzögerung im
Seitenaufbau).

Ich würde erstmal die Zugriffszeiten analysieren, um zu sehen, welche Queries so langsam sind. Dazu kann man Queries protokollieren lassen, die länger als eine bestimmte Zeit brauchen. Das kannst Du in der my.cnf bei log-slow-queries einstellen. Explain ist auch eine gute Hilfe, um solchen Engpässen auf die Spur zu kommen. Nähere Erläuterungen dazu findest Du hier:
http://www.schefter.net/deutsch/techtalk/mysql_perfo…

und im MySQL-Handbuch u.a. auch hier:
http://dev.mysql.com/books/hpmysql-excerpts/ch06.html
aber wenn Du im Handbuch nach „Performance“ suchst, findest Du noch mehr Stellen.

Viel Erfolg beim Optimieren
Klaus Bernstein