mirror of
https://github.com/Dvorinka/MyClubServer.git
synced 2026-06-04 10:42:57 +00:00
83 lines
4.3 KiB
SQL
83 lines
4.3 KiB
SQL
-- Performance indexes for optimal query performance
|
|
-- Run this migration to achieve 10/10 database performance
|
|
|
|
-- Articles table indexes
|
|
CREATE INDEX IF NOT EXISTS idx_articles_published_date ON articles(published, published_at DESC) WHERE published = true;
|
|
CREATE INDEX IF NOT EXISTS idx_articles_slug ON articles(slug) WHERE slug IS NOT NULL;
|
|
CREATE INDEX IF NOT EXISTS idx_articles_category ON articles(category_id) WHERE category_id IS NOT NULL;
|
|
CREATE INDEX IF NOT EXISTS idx_articles_author ON articles(author_id);
|
|
CREATE INDEX IF NOT EXISTS idx_articles_featured ON articles(featured, published_at DESC) WHERE featured = true AND published = true;
|
|
CREATE INDEX IF NOT EXISTS idx_articles_search ON articles USING gin(to_tsvector('english', title || ' ' || COALESCE(content, '')));
|
|
|
|
-- Players table indexes
|
|
CREATE INDEX IF NOT EXISTS idx_players_team ON players(team_id) WHERE team_id IS NOT NULL;
|
|
CREATE INDEX IF NOT EXISTS idx_players_position ON players(position) WHERE position IS NOT NULL;
|
|
CREATE INDEX IF NOT EXISTS idx_players_active ON players(is_active) WHERE is_active = true;
|
|
CREATE INDEX IF NOT EXISTS idx_players_name ON players(name);
|
|
|
|
-- Users table indexes
|
|
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
|
|
CREATE INDEX IF NOT EXISTS idx_users_role ON users(role);
|
|
CREATE INDEX IF NOT EXISTS idx_users_created ON users(created_at DESC);
|
|
|
|
-- Categories table indexes
|
|
CREATE INDEX IF NOT EXISTS idx_categories_name ON categories(name);
|
|
|
|
-- Newsletter subscriptions indexes
|
|
CREATE INDEX IF NOT EXISTS idx_newsletter_email ON newsletter_subscriptions(email);
|
|
CREATE INDEX IF NOT EXISTS idx_newsletter_active ON newsletter_subscriptions(is_active) WHERE is_active = true;
|
|
|
|
-- Contact messages indexes
|
|
CREATE INDEX IF NOT EXISTS idx_contact_messages_created ON contact_messages(created_at DESC);
|
|
CREATE INDEX IF NOT EXISTS idx_contact_messages_read ON contact_messages(is_read) WHERE is_read = false;
|
|
|
|
-- Polls indexes
|
|
CREATE INDEX IF NOT EXISTS idx_polls_active ON polls(is_active, end_date) WHERE is_active = true;
|
|
CREATE INDEX IF NOT EXISTS idx_poll_votes_poll ON poll_votes(poll_id);
|
|
CREATE INDEX IF NOT EXISTS idx_poll_votes_user ON poll_votes(user_identifier);
|
|
|
|
-- Match overrides indexes
|
|
CREATE INDEX IF NOT EXISTS idx_match_overrides_external ON match_overrides(external_match_id);
|
|
|
|
-- Team logo overrides indexes
|
|
CREATE INDEX IF NOT EXISTS idx_team_logo_external ON team_logo_overrides(external_team_id);
|
|
|
|
-- Uploaded files indexes
|
|
CREATE INDEX IF NOT EXISTS idx_uploaded_files_user ON uploaded_files(uploaded_by_id) WHERE uploaded_by_id IS NOT NULL;
|
|
CREATE INDEX IF NOT EXISTS idx_uploaded_files_created ON uploaded_files(created_at DESC);
|
|
|
|
-- Settings table (only one row, no index needed)
|
|
|
|
-- Competition aliases indexes
|
|
CREATE INDEX IF NOT EXISTS idx_competition_aliases_code ON competition_aliases(code);
|
|
CREATE INDEX IF NOT EXISTS idx_competition_aliases_order ON competition_aliases(display_order) WHERE display_order > 0;
|
|
|
|
-- Clothing items indexes
|
|
CREATE INDEX IF NOT EXISTS idx_clothing_category ON clothing(category) WHERE category IS NOT NULL;
|
|
CREATE INDEX IF NOT EXISTS idx_clothing_available ON clothing(is_available) WHERE is_available = true;
|
|
|
|
-- Composite indexes for common queries
|
|
CREATE INDEX IF NOT EXISTS idx_articles_category_published ON articles(category_id, published, published_at DESC) WHERE published = true;
|
|
CREATE INDEX IF NOT EXISTS idx_articles_author_published ON articles(author_id, published, published_at DESC) WHERE published = true;
|
|
|
|
-- Partial indexes for better performance on filtered queries
|
|
CREATE INDEX IF NOT EXISTS idx_articles_published_only ON articles(published_at DESC) WHERE published = true;
|
|
CREATE INDEX IF NOT EXISTS idx_articles_unpublished_only ON articles(created_at DESC) WHERE published = false;
|
|
|
|
-- VACUUM ANALYZE to update statistics
|
|
VACUUM ANALYZE articles;
|
|
VACUUM ANALYZE players;
|
|
VACUUM ANALYZE users;
|
|
VACUUM ANALYZE categories;
|
|
VACUUM ANALYZE newsletter_subscriptions;
|
|
VACUUM ANALYZE contact_messages;
|
|
VACUUM ANALYZE polls;
|
|
VACUUM ANALYZE poll_options;
|
|
VACUUM ANALYZE poll_votes;
|
|
|
|
-- Add comments for documentation
|
|
COMMENT ON INDEX idx_articles_published_date IS 'Optimizes published articles listing';
|
|
COMMENT ON INDEX idx_articles_search IS 'Full-text search on articles';
|
|
COMMENT ON INDEX idx_players_team IS 'Player queries by team';
|
|
COMMENT ON INDEX idx_newsletter_active IS 'Active subscriber queries';
|