42 lines
2.2 KiB
MySQL
42 lines
2.2 KiB
MySQL
|
|
-- 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 $$;
|
||
|
|
|