Ich habe eine Anwendung mit dem Laravel-Framework gebaut. Eine seiner Eigenschaften ist die Fähigkeit, polymorphe Beziehungen zwischen Tabellen zu erstellen. Dies geschieht durch Speichern der ID der verknüpften Tabelle und des vollständig qualifizierten Klassennamens des Modells der zugehörigen Tabelle. Wie Sie sich vorstellen können, können einige der Einträge abhängig von den Namespaces und dem Klassennamen des Modells ziemlich lang sein.MySQL Varchar Index Speicher
In meinem Szenario habe ich 4 Tabellen. Basistabelle A
, die polymorph ist. Tabellen B
, C
und die nicht sind.
Die Klassennamen für die nicht polymorphe Tischmodelle wie folgt aus:
LongNamespace\SubNamespace\Something\B
LongNamespace\SubNamespace\Something\C
LongNamespace\SubNamespace\Something\D
Ergebnisse aus Tabelle A
aussehen würde:
id | relation_id | relation_type
--------------------------------
1 | 1 | LongNamespace\SubNamespace\Something\B
2 | 2 | LongNamespace\SubNamespace\Something\C
3 | 5 | LongNamespace\SubNamespace\Something\D
4 | 12 | LongNamespace\SubNamespace\Something\D
5 | 3 | LongNamespace\SubNamespace\Something\B
6 | 6 | LongNamespace\SubNamespace\Something\C
... etc (around 50,000 rows) ...
mit 38 Bytes pro Datensatz hinzugefügt, von denen die meisten wiederholt Daten, meine Frage ist, würde einen Index auf die relation_type
Spalte speichern jeden einzelnen relation_type
Datensatz einzeln im Speicher (was ich nehme, was passiert mit Indizes) oder wird es gruppieren sie wie ein ENUM so der Gesamtspeicher wäre die 3 eindeutigen Einträge in relation_type
, die dann intern durch eine Hash-Tabelle irgendeiner Art verbunden werden, ergo spart n * 38 Bytes Speicherplatz.