MySQL ist auch bei mir am Ende angelangt.
3,5 Mill. Einträge in einer Tabelle und Ende im Gelände ....
Ich habe das System vor einem halben Jahr in den Datenbankabfragen optimiert. Früher waren es um die 120 Abfragen pro Seite (ja, Asche auf mein Haupt ;o)), heute sind es nur noch um die 30 bis 40.
Dementsprechend ging jetzt natürlich die Useranzahl nach dem Update nach oben. Der Server war flotter unterwegs.
Derzeit habe ich im Durchschnitt ca. 120 DB-Abfragen pro Sekunde! Pro Monat um die 220GB Traffic.
Ich weis auch nicht mehr wie ichs handeln kann.
170 MB Speicher im laufenden Prozess des Servers ...
Mal am Beispiel;
Code: Select all
CREATE TABLE `yno_priv_msgs` (
`msg_id` int(10) NOT NULL auto_increment,
`msg_image` varchar(100) default NULL,
`subject` varchar(100) default NULL,
`from_userid` int(10) NOT NULL default '0',
`to_userid` int(10) NOT NULL default '0',
`msg_time` varchar(20) default NULL,
`msg_text` text,
`read_msg` tinyint(10) NOT NULL default '0',
PRIMARY KEY (`msg_id`),
KEY `to_userid` (`to_userid`)
) TYPE=MyISAM;
Das ist die Tabelle (besser eine) die am meisten Schwierigkeiten verursacht. Es handelt sich hierbei um eine Art Kurz-Nachrichten Tool.
Viele Nachrichten werden zwar gleich gelöscht, jedoch bleiben auch ne Menge "liegen".
So der Index msg_id unter 500.000 bleibt und die Zeilen (Nachrichten) bei ca. 35.000, macht die Tabelle so gut wie keine Probleme.
Aber wehe es geht im Index über 1 Mill. Dann sucht sich das Ding dumm und dusselig.
Die Tabelle wird pro User einmal pro Minute abgefragt. Es wird hinzugeschrieben, gelöscht etc. Da hängt ne Abfrage oft 2 bis 5 Sekunden .... je nach Userlast mit der Abfrage z.B.
Code: Select all
SELECT msg_id, from_userid
FROM yno_priv_msgs
WHERE (
to_userid = '5290'
)
AND (
read_msg = '0'
)
(read_msg = 0 deshalb, damit keine ungelesenen gelöscht werden können)
Was bedeutet, ich muss diese Tabelle wohl in mehrere aufteilen. Und das kann es ja an sich nicht sein, denke ich mir mal.
Alternativen?!
Um ehrlich zu sein, ich weis an der Stelle mal nicht weiter