61 lines
4 KiB
SQL
61 lines
4 KiB
SQL
-- 049_composite_indexes.sql
|
|
-- Composite Indexes for Common Queries (BE-DB-010: Add composite indexes for common queries)
|
|
-- Add indexes on (user_id, status), (playlist_id, track_id), etc.
|
|
|
|
-- === TRACKS COMPOSITE INDEXES ===
|
|
-- Index for tracks by creator and visibility/public status
|
|
CREATE INDEX IF NOT EXISTS idx_tracks_creator_id_is_public ON public.tracks(creator_id, is_public) WHERE deleted_at IS NULL;
|
|
CREATE INDEX IF NOT EXISTS idx_tracks_creator_id_created_at ON public.tracks(creator_id, created_at DESC) WHERE deleted_at IS NULL;
|
|
|
|
-- Index for tracks by status and created_at (for processing queue)
|
|
CREATE INDEX IF NOT EXISTS idx_tracks_status_created_at ON public.tracks(status, created_at) WHERE status IN ('uploading', 'processing');
|
|
|
|
-- === PLAYLISTS COMPOSITE INDEXES ===
|
|
-- Index for playlists by user and visibility
|
|
CREATE INDEX IF NOT EXISTS idx_playlists_user_id_is_public ON public.playlists(user_id, is_public) WHERE deleted_at IS NULL;
|
|
CREATE INDEX IF NOT EXISTS idx_playlists_user_id_created_at ON public.playlists(user_id, created_at DESC) WHERE deleted_at IS NULL;
|
|
|
|
-- === PLAYLIST_TRACKS COMPOSITE INDEXES ===
|
|
-- Index for playlist_tracks by playlist and track (for checking if track exists in playlist)
|
|
-- Note: idx_playlist_tracks_playlist_id_position already exists, but we add (playlist_id, track_id) for existence checks
|
|
CREATE INDEX IF NOT EXISTS idx_playlist_tracks_playlist_track ON public.playlist_tracks(playlist_id, track_id);
|
|
|
|
-- === TRACK_LIKES COMPOSITE INDEXES ===
|
|
-- Index for track_likes by track and user (for checking if user liked track)
|
|
CREATE INDEX IF NOT EXISTS idx_track_likes_track_user ON public.track_likes(track_id, user_id);
|
|
|
|
-- === TRACK_COMMENTS COMPOSITE INDEXES ===
|
|
-- Index for track_comments by track and created_at (for listing comments)
|
|
CREATE INDEX IF NOT EXISTS idx_track_comments_track_created_at ON public.track_comments(track_id, created_at DESC) WHERE deleted_at IS NULL;
|
|
|
|
-- Index for track_comments by track and parent_id (for replies)
|
|
CREATE INDEX IF NOT EXISTS idx_track_comments_track_parent ON public.track_comments(track_id, parent_id) WHERE parent_id IS NOT NULL AND deleted_at IS NULL;
|
|
|
|
-- === MESSAGES COMPOSITE INDEXES ===
|
|
-- Index for messages by room and created_at (for listing messages in a room)
|
|
CREATE INDEX IF NOT EXISTS idx_messages_room_created_at ON public.messages(room_id, created_at DESC) WHERE deleted_at IS NULL;
|
|
|
|
-- === FOLLOWS COMPOSITE INDEXES ===
|
|
-- Index for follows by follower and created_at (for listing who a user follows)
|
|
CREATE INDEX IF NOT EXISTS idx_follows_follower_created_at ON public.follows(follower_id, created_at DESC);
|
|
|
|
-- Index for follows by followed and created_at (for listing followers)
|
|
CREATE INDEX IF NOT EXISTS idx_follows_followed_created_at ON public.follows(followed_id, created_at DESC);
|
|
|
|
-- === NOTIFICATIONS COMPOSITE INDEXES ===
|
|
-- Index for notifications by user and read status (for listing unread notifications)
|
|
CREATE INDEX IF NOT EXISTS idx_notifications_user_read_created_at ON public.notifications(user_id, read, created_at DESC);
|
|
|
|
-- === ANALYTICS COMPOSITE INDEXES ===
|
|
-- Index for analytics_events by event_name and created_at (already exists, but ensure it's there)
|
|
-- Note: Check if idx_analytics_events_name_created exists, if not create it
|
|
CREATE INDEX IF NOT EXISTS idx_analytics_events_name_created_at ON public.analytics_events(event_name, created_at DESC);
|
|
|
|
-- Comments
|
|
COMMENT ON INDEX idx_tracks_creator_id_is_public IS 'Composite index for filtering tracks by creator and public status';
|
|
COMMENT ON INDEX idx_playlists_user_id_is_public IS 'Composite index for filtering playlists by user and public status';
|
|
COMMENT ON INDEX idx_playlist_tracks_playlist_track IS 'Composite index for checking if track exists in playlist';
|
|
COMMENT ON INDEX idx_track_likes_track_user IS 'Composite index for checking if user liked a track';
|
|
COMMENT ON INDEX idx_messages_room_created_at IS 'Composite index for listing messages in a room ordered by date';
|
|
COMMENT ON INDEX idx_notifications_user_read_created_at IS 'Composite index for listing notifications by user, read status, and date';
|
|
|