Ich habe dieses Schema, das Chat-Nachrichten speichert. Derzeit habe ich ungefähr 100k Zeilen, was etwa 5,5 MB Daten ist. Die Indexgröße beträgt 6,5 MB. Wenn die Datengröße ~ 4MB war, war die Indexgröße ~ 3MB, also wächst sie exponentiell?Tabelle zum Reduzieren der Indexgröße optimieren
CREATE TABLE `messages` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`author` int(11) unsigned DEFAULT NULL,
`time` int(10) unsigned DEFAULT NULL,
`text` text,
`dest` int(11) unsigned DEFAULT NULL,
`type` tinyint(4) unsigned DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `history` (`author`,`dest`,`id`) USING BTREE,
KEY `messages_ibfk_1` (`dest`),
FULLTEXT KEY `msg` (`text`),
CONSTRAINT `au` FOREIGN KEY (`author`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `messages_ibfk_1` FOREIGN KEY (`dest`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=105895 DEFAULT CHARSET=utf8;
Die Hauptabfrage, die ich für diese Tabelle renne und ich habe versucht, es zu optimieren für ist, wenn ich paginierte Geschichte für einen Chat zwischen 2 Personen
SELECT id, time, text, dest, type, author
FROM `messages`
WHERE (
(author = ? AND dest = ?) OR (author = ? AND dest = ?)
) AND id <= ? ORDER BY id DESC LIMIT ?, 25
Das zeigen müssen Andere Abfragen für den Verlauf sind identisch, außer dass sie zusätzliche Filter für einen Suchbegriff oder einen Datumsbereich enthalten.
Gibt es etwas, das getan werden kann, um die Indexgröße zu reduzieren und eine optimale Leistung aufrechtzuerhalten?
Warum denken Sie, dass die Indexgröße etwas mit Leistung zu tun hat? Laufen Ihre Abfragen langsam? Wenn Sie keine Indizes hätten, würden Sie zwar viel Speicherplatz sparen, aber Ihre Abfragen wären viel langsamer, also ist es offensichtlich, dass ein Index einen Platz-Performance-Kompromiss darstellt und Sie den Index überhaupt haben Ich habe den Wunsch geäußert, Leistung auf Kosten des Weltraums zu haben. –
Ihr Index ist möglicherweise größer als die Tabelle selbst, wenn MySQL in Erwartung zukünftiger Einsätze etwas freien Speicherplatz im btree belässt. –
Übrigens könnten Sie die Größe Ihres Indexes verringern und die Abfrageleistung verbessern, indem Sie "user1" und "user2" anstelle von "author" und "dest" speichern, die beiden Benutzer alphabetisch anordnen und "user1" zum ersten Benutzer machen "user2" der zweite. Wenn Sie also Gespräche zwischen Mark und Alice finden möchten, ist Alice immer "Benutzer1" und Mark wird immer "Benutzer2". Dann können Sie eine weitere Spalte hinzufügen, um anzugeben, ob "Benutzer1" der Autor oder Empfänger ist. –