Dies ist eine Fortsetzung meiner Frage "Effizientes Speichern von 7.300.000.000 Zeilen" (Effizientes Speichern von 7.300.000.000 Zeilen).
Ich habe mich entschieden, MySQL mit Partitionierung zu verwenden, und das vorläufige Schema sieht wie folgt aus:
CREATE TABLE entity_values (
entity_id MEDIUMINT UNSIGNED DEFAULT 0 NOT NULL, # 3 bytes = [0 .. 16.777.215]
date_id SMALLINT UNSIGNED DEFAULT 0 NOT NULL, # 2 bytes = [0 .. 65.535]
value_1 MEDIUMINT UNSIGNED DEFAULT 0 NOT NULL, # 3 bytes = [0 .. 16.777.215]
value_2 MEDIUMINT UNSIGNED DEFAULT 0 NOT NULL, # 3 bytes = [0 .. 16.777.215]
UNIQUE KEY (entity_id, date_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 PARTITION BY HASH(entity_id) PARTITIONS 25;
Dies ergibt:
- Zeilen = 7.300.000.000 Zeilen (wie in der vorherigen Post-Anforderung angegeben)
- Größe/Zeile = 11 Bytes (3+2+3+3)
- Gesamtgröße = 7.300.000.000 Zeilen * 11 Bytes = 80.300.000.000 Bytes = 80,3 GB
- Partitionen = 25 (3,2 GB / Partition, die Größe der Partition ist etwas willkürlich)
Bitte beachten Sie, dass ich den Primärschlüssel aus dem ursprünglichen Design fallen gelassen habe, da die Spalte "id" nicht verwendet wird.
Nun zu meiner Frage - basierend auf den Anforderungen, die in meinem vorherigen Post dargelegt wurden, und dem oben genannten Schema, haben Sie irgendwelche Vorschläge für weitere Optimierungen/Anpassungen, die vorgenommen werden können? Oder ist das obige Schema "optimal", wenn ich mich für MySQL entschieden habe?
Aktualisierung: Ich habe versucht, den aktuellen Datensatz in das oben genannte Schema zu laden, und die 8.570.532 Zeilen belegten 212.000.000 Bytes Speicherplatz, was ungefähr 24,7 Bytes pro Zeile entspricht.
Aktualisierung: Bitte beachten Sie, dass der Index, der entity_id+date_id abdeckt, auch für Abfragen verwendet wird, die nur entity_id als Ziel haben.