Ich schaue zuerst auf die Indizes
Die meisten langsamen Abfragen sind aus einem Grund langsam. Postgres liest jede Zeile in der Tabelle, eine nach der anderen. Ich führe EXPLAIN (ANALYZE, BUFFERS) auf der langsamen Abfrage aus und suche nach einem sequenziellen Scan auf einer großen Tabelle. Dann füge ich den richtigen Index hinzu. Eine Abfrage, die vier Sekunden dauerte, fällt auf vier Millisekunden. Dieser eine Schritt löst mehr Probleme als alles andere.
Ich passe die Speichereinstellungen an
Die Standardkonfiguration ist für eine kleine Maschine gebaut. Fast niemand ändert sie. Auf einem echten Server passe ich vier Einstellungen an:
shared_bufferseffective_cache_sizework_memmaintenance_work_mem
Diese vier bringen oft den größten Sprung bei der Geschwindigkeit. Die Standardwerte verschwenden den RAM, für den du schon bezahlt hast.
Ich halte Autovacuum zufrieden
Tote Zeilen sammeln sich mit der Zeit an. Die Statistiken werden alt. Der Planner trifft schlechte Entscheidungen. Die Leistung sinkt langsam, und eines Tages gerät jemand in Panik. Ich mache Autovacuum aggressiver bei den vielbeschäftigten Tabellen und halte die Statistiken frisch. Der Planner wählt dann von selbst gute Pläne.
Ich behebe das N+1 in der App
Manchmal ist die Datenbank in Ordnung und die App ist das Problem. Ein ORM feuert 500 kleine Abfragen ab, um eine Seite zu zeichnen. Keine Datenbankeinstellung rettet dich davor. Ich fasse die Lesevorgänge zusammen. Ich nutze Joins. Ich stelle PgBouncer davor, damit die App nicht mehr für jede Anfrage eine neue Verbindung bezahlt.
Ich messe, bevor ich rate
Ich schalte pg_stat_statements ein. Es zeigt mir, welche Abfragen die meiste Zeit fressen. So behebe ich das echte Problem, nicht das, das ich mir vorstelle. Der größte Teil der Last kommt von nur wenigen Abfragen. Ich finde sie und ich behebe sie.
Die einfache Wahrheit
PostgreSQL läuft weit auf einem guten Server, bevor du sharden oder migrieren musst. Leute wechseln zu früh zu einer neuen Datenbank. Sie geben Postgres die Schuld, bevor sie es konfigurieren.
Also bevor du dich von Postgres abwendest, probiere zuerst diese Liste aus. Meistens bleibst du.
