113 lines
3.8 KiB
SQL
113 lines
3.8 KiB
SQL
-- Database Performance Indexes
|
|
-- Adds indexes to frequently queried columns for improved performance
|
|
--
|
|
-- Run with: sqlite3 /opt/media-downloader/database/downloads.db < scripts/add-database-indexes.sql
|
|
|
|
-- ============================================================================
|
|
-- Downloads Table Indexes
|
|
-- ============================================================================
|
|
|
|
-- Index on platform for filtering downloads by platform
|
|
CREATE INDEX IF NOT EXISTS idx_downloads_platform
|
|
ON downloads(platform);
|
|
|
|
-- Index on source for filtering downloads by source/username
|
|
CREATE INDEX IF NOT EXISTS idx_downloads_source
|
|
ON downloads(source);
|
|
|
|
-- Index on download_date for time-based queries (DESC for most recent first)
|
|
CREATE INDEX IF NOT EXISTS idx_downloads_download_date
|
|
ON downloads(download_date DESC);
|
|
|
|
-- Index on status for filtering by download status
|
|
CREATE INDEX IF NOT EXISTS idx_downloads_status
|
|
ON downloads(status);
|
|
|
|
-- Compound index for platform + source queries (common filter combination)
|
|
CREATE INDEX IF NOT EXISTS idx_downloads_platform_source
|
|
ON downloads(platform, source);
|
|
|
|
-- Compound index for platform + download_date (common for analytics)
|
|
CREATE INDEX IF NOT EXISTS idx_downloads_platform_date
|
|
ON downloads(platform, download_date DESC);
|
|
|
|
-- Index on filename for search queries
|
|
CREATE INDEX IF NOT EXISTS idx_downloads_filename
|
|
ON downloads(filename);
|
|
|
|
-- Index on media_id for duplicate detection
|
|
CREATE INDEX IF NOT EXISTS idx_downloads_media_id
|
|
ON downloads(media_id)
|
|
WHERE media_id IS NOT NULL;
|
|
|
|
-- Index on file_hash for duplicate detection
|
|
CREATE INDEX IF NOT EXISTS idx_downloads_file_hash
|
|
ON downloads(file_hash)
|
|
WHERE file_hash IS NOT NULL;
|
|
|
|
-- ============================================================================
|
|
-- Notifications Table Indexes
|
|
-- ============================================================================
|
|
|
|
-- Index on sent_at for time-based queries
|
|
CREATE INDEX IF NOT EXISTS idx_notifications_sent_at
|
|
ON notifications(sent_at DESC);
|
|
|
|
-- Index on platform for filtering notifications
|
|
CREATE INDEX IF NOT EXISTS idx_notifications_platform
|
|
ON notifications(platform);
|
|
|
|
-- Index on status for filtering by notification status
|
|
CREATE INDEX IF NOT EXISTS idx_notifications_status
|
|
ON notifications(status);
|
|
|
|
-- Compound index for platform + sent_at (common query)
|
|
CREATE INDEX IF NOT EXISTS idx_notifications_platform_sent_at
|
|
ON notifications(platform, sent_at DESC);
|
|
|
|
-- ============================================================================
|
|
-- Scheduler State Table Indexes
|
|
-- ============================================================================
|
|
|
|
-- Index on status for active task queries
|
|
CREATE INDEX IF NOT EXISTS idx_scheduler_state_status
|
|
ON scheduler_state(status);
|
|
|
|
-- Index on next_run for finding next scheduled tasks
|
|
CREATE INDEX IF NOT EXISTS idx_scheduler_state_next_run
|
|
ON scheduler_state(next_run ASC);
|
|
|
|
-- Index on platform for platform-specific queries
|
|
CREATE INDEX IF NOT EXISTS idx_scheduler_state_platform
|
|
ON scheduler_state(platform);
|
|
|
|
-- ============================================================================
|
|
-- Users Table Indexes
|
|
-- ============================================================================
|
|
|
|
-- Index on username for login queries
|
|
CREATE INDEX IF NOT EXISTS idx_users_username
|
|
ON users(username);
|
|
|
|
-- Index on email for lookup queries (if email is used)
|
|
CREATE INDEX IF NOT EXISTS idx_users_email
|
|
ON users(email)
|
|
WHERE email IS NOT NULL;
|
|
|
|
-- ============================================================================
|
|
-- Performance Analysis
|
|
-- ============================================================================
|
|
|
|
-- Run ANALYZE to update query planner statistics
|
|
ANALYZE;
|
|
|
|
-- Display index information
|
|
SELECT
|
|
'Index Information' as info,
|
|
name as index_name,
|
|
tbl_name as table_name
|
|
FROM sqlite_master
|
|
WHERE type = 'index'
|
|
AND name LIKE 'idx_%'
|
|
ORDER BY tbl_name, name;
|