Verbesserung: DB-Performance – Index auf voice_sessions(user_id, created_at) fehlt #17

Open
opened 2026-06-10 11:48:16 +00:00 by Jannis · 0 comments
Owner

Performance / Verbesserung

Beschreibung

Die voice_sessions-Tabelle wird in allen Queries nach user_id und created_at gefiltert:

SELECT SUM(seconds) FROM voice_sessions
WHERE user_id = ? AND created_at > datetime('now', '-30 days')

SELECT user_id, SUM(seconds) FROM voice_sessions
WHERE created_at > datetime('now', '-30 days')
GROUP BY user_id ORDER BY total DESC

Ohne Index werden bei diesen Queries immer alle Zeilen gescannt (Full Table Scan). Mit wachsender DB wird das zunehmend langsamer.

Fix

In InitDB() Indizes anlegen:

statement := `
CREATE TABLE IF NOT EXISTS voice_sessions (
    user_id    TEXT,
    seconds    INTEGER,
    created_at TIMESTAMP
);
CREATE INDEX IF NOT EXISTS idx_user_created ON voice_sessions(user_id, created_at);
CREATE INDEX IF NOT EXISTS idx_created ON voice_sessions(created_at);
`

Vorteil

  • GetUserStats() wird deutlich schneller (Lookup per Index statt Full Scan)
  • GetTopUsers() profitiert ebenfalls beim Filtern nach created_at
  • CleanupOldEntries() löscht effizienter
## Performance / Verbesserung ### Beschreibung Die `voice_sessions`-Tabelle wird in allen Queries nach `user_id` und `created_at` gefiltert: ```sql SELECT SUM(seconds) FROM voice_sessions WHERE user_id = ? AND created_at > datetime('now', '-30 days') SELECT user_id, SUM(seconds) FROM voice_sessions WHERE created_at > datetime('now', '-30 days') GROUP BY user_id ORDER BY total DESC ``` Ohne Index werden bei diesen Queries immer alle Zeilen gescannt (Full Table Scan). Mit wachsender DB wird das zunehmend langsamer. ### Fix In `InitDB()` Indizes anlegen: ```go statement := ` CREATE TABLE IF NOT EXISTS voice_sessions ( user_id TEXT, seconds INTEGER, created_at TIMESTAMP ); CREATE INDEX IF NOT EXISTS idx_user_created ON voice_sessions(user_id, created_at); CREATE INDEX IF NOT EXISTS idx_created ON voice_sessions(created_at); ` ``` ### Vorteil - `GetUserStats()` wird deutlich schneller (Lookup per Index statt Full Scan) - `GetTopUsers()` profitiert ebenfalls beim Filtern nach `created_at` - `CleanupOldEntries()` löscht effizienter
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: starfour/discord-go-bot#17