Ich muss meine kleine große Datenbank optimieren, weil es zu langsam ist, vielleicht finden wir eine andere Lösung zusammen.Eine andere Möglichkeit, Datenbankstruktur zu erstellen
Zunächst sprechen wir über Daten, die in der Datenbank gespeichert sind. Es gibt zwei Objekte: users
und sagen wir mal, messages
Benutzer
Es ist so etwas wie das:
+----+---------+-------+-----+
| id | user_id | login | etc |
+----+---------+-------+-----+
| 1 | 100001 | A | ....|
| 2 | 100002 | B | ....|
| 3 | 100003 | C | ....|
|... | ...... | ... | ....|
+----+---------+-------+-----+
Es gibt kein Problem innerhalb dieser Tabelle ist. (Haben Sie keine Angst von id
und user_id
. user_id
von einer anderen Anwendung verwendet wird, so hat es hier zu sein.)
Nachrichten
Und die zweite Tabelle hat ein Problem. Jeder Benutzer hat zum Beispiel Meldungen wie diese:
+----+---------+------+----+
| id | user_id | from | to |
+----+---------+------+----+
| 1 | 1 | aab | bbc|
| 2 | 2 | vfd | gfg|
| 3 | 1 | aab | bbc|
| 4 | 1 | fge | gfg|
| 5 | 3 | aab | gdf|
|... | ...... | ... | ...|
+----+---------+------+----+
Es gibt keine Notwendigkeit, edit
Nachrichten, aber es sollte eine Gelegenheit sein, um die Liste der Meldungen für den Benutzer aktualisiert. Zum Beispiel sendet ein externer Dienst alle Nachrichten des Benutzers an die Datenbank und die Liste muss aktualisiert werden. Und das Wichtigste ist, dass es etwa 30 Millionen Benutzer gibt und der durchschnittliche Benutzer mehr als 500 Nachrichten hat. Ein weiteres Problem, das ich durch das Feld from
suchen und die Anzahl der Übereinstimmungen berechnen muss. Ich habe eine einfache SQL-Abfrage mit Join entworfen, aber es dauert zu viel Zeit, um die Daten zu erhalten.
Also ... es ist ziemlich viel Datenmenge. Ich entschied mich, RDS nicht zu benutzen (ich benutzte Postgresql) und entschied mich, zu Datenbanken wie Clickhouse
und so weiter zu gehen.
Allerdings habe ich mit einem Problem konfrontiert, dass zum Beispiel Clickhouse
keine UPDATE
Anweisung unterstützt.
Um dieses Problem zu beheben, entschied ich mich, Nachrichten als eine Zeile zu speichern. So ist die Tabelle Messages
sollte wie folgt sein:
Here I'd like to store messages in JSON format
{"from":"aaa", "to":bbe"}
{"from":"ret", "to":fdd"}
{"from":"gfd", "to":dgf"}
||
\/
+----+---------+----------+------+ And there I'd like to store the
| id | user_id | messages | hash | <= hash of the messages.
+----+---------+----------+------+
Ich denke, dass die Volltextsuche innerhalb der messages
Spalte wird einige Zeit Ressourcen sparen und so weiter.
Haben Sie irgendwelche Ideen? :)
Ich muss sagen, dass Ihre Frage sehr breit ist. Zuallererst, welche Typen sind von und zu Spalten? Zweitens, wie haben Sie Indizes verwendet, als Sie PostgreSQL verwendet haben? Hast du Partitionen untersucht? –
'from' und' to' ist varchar (255) und ich habe nicht in Partitionen gesucht ... Könnten Sie ein Tutorial zur Verfügung stellen? – Ascelhem