- Created migration 920_add_performance_indexes.sql - Added indexes on tracks.status, tracks.user_id, tracks.stream_status - Added composite index on tracks(user_id, status) - Added indexes on playlists.is_public, user_sessions.is_active - Added composite index on user_sessions(user_id, is_active) - Verified existing indexes on users.email, users.username, tracks.creator_id, playlists.user_id, sessions.user_id Phase: PHASE-1 Priority: P0 Progress: 11/267 (4.1%)
41 lines
2.2 KiB
SQL
41 lines
2.2 KiB
SQL
-- 920_add_performance_indexes.sql
|
|
-- Add performance-critical indexes for frequently queried fields
|
|
-- BE-DB-001: Add database indexes for performance-critical queries
|
|
|
|
-- Index on tracks.status for filtering by status (uploading, processing, ready, error)
|
|
CREATE INDEX IF NOT EXISTS idx_tracks_status ON public.tracks(status) WHERE status IS NOT NULL;
|
|
|
|
-- Index on tracks.user_id (legacy field, but still used in some queries)
|
|
-- Note: creator_id already has an index (idx_tracks_creator_id)
|
|
CREATE INDEX IF NOT EXISTS idx_tracks_user_id ON public.tracks(user_id) WHERE user_id IS NOT NULL;
|
|
|
|
-- Composite index for common track queries: user_id + status
|
|
CREATE INDEX IF NOT EXISTS idx_tracks_user_id_status ON public.tracks(user_id, status) WHERE user_id IS NOT NULL AND status IS NOT NULL;
|
|
|
|
-- Index on tracks.stream_status for filtering by stream processing status
|
|
CREATE INDEX IF NOT EXISTS idx_tracks_stream_status ON public.tracks(stream_status) WHERE stream_status IS NOT NULL;
|
|
|
|
-- Index on tracks.is_public for public/private filtering (legacy field)
|
|
CREATE INDEX IF NOT EXISTS idx_tracks_is_public ON public.tracks(is_public) WHERE is_public = true;
|
|
|
|
-- Additional indexes for common query patterns
|
|
|
|
-- Index on playlists.is_public for public playlist queries
|
|
-- Note: visibility already has an index (idx_playlists_visibility)
|
|
CREATE INDEX IF NOT EXISTS idx_playlists_is_public ON public.playlists(is_public) WHERE is_public = true;
|
|
|
|
-- Index on user_sessions.is_active for active session lookups
|
|
CREATE INDEX IF NOT EXISTS idx_user_sessions_is_active ON public.user_sessions(is_active) WHERE is_active = true;
|
|
|
|
-- Index on user_sessions.user_id + is_active for common session queries
|
|
CREATE INDEX IF NOT EXISTS idx_user_sessions_user_id_active ON public.user_sessions(user_id, is_active) WHERE is_active = true;
|
|
|
|
-- Index on sessions table (if it exists separately from user_sessions)
|
|
-- Note: This uses IF NOT EXISTS to avoid errors if table doesn't exist
|
|
DO $$
|
|
BEGIN
|
|
IF EXISTS (SELECT 1 FROM information_schema.tables WHERE table_schema = 'public' AND table_name = 'sessions') THEN
|
|
CREATE INDEX IF NOT EXISTS idx_sessions_user_id_active ON public.sessions(user_id) WHERE revoked_at IS NULL;
|
|
END IF;
|
|
END $$;
|
|
|