/* ========================================================== OTIMIZAÇÃO DE PERFORMANCE - ARAPIRACA (MariaDB 10.4) Foco: painel, vereador, votação, quórum, fala. Não altera estrutura; apenas índices. ========================================================== */ USE arapiraca; /* --------------------------- 1) sessoes (sessão ativa e última sessão) Query típica: WHERE status='ativa' e ORDER BY data_sessao DESC, id DESC LIMIT 1 ---------------------------- */ -- Já existe idx_sessoes_status_data (status, data_sessao) -- Esse abaixo melhora ainda mais o ORDER BY + LIMIT 1 com o id CREATE INDEX idx_sessoes_status_data_id ON sessoes (status, data_sessao, id); /* --------------------------- 2) sessao_materias (matéria ativa/aguardando/votação por sessão) Query típica: WHERE sessao_id=? AND status IN (...) ORDER BY ordem ASC ---------------------------- */ -- Você tem índice separado por sessao_id e por status. -- Este composto resolve o "painel travando" em consulta de lista/ativa. CREATE INDEX idx_sm_sessao_status_ordem ON sessao_materias (sessao_id, status, ordem, id); -- Se você busca publicações no site ou filtros por publicar_site: CREATE INDEX idx_sm_publicar_sessao ON sessao_materias (publicar_site, sessao_id); /* --------------------------- 3) votos (apuração rápida por matéria) Normalmente: WHERE sessao_materia_id=? (contar e listar) ---------------------------- */ -- Já existe idx_votos_sessao_materia e idx_votos_sessao_materia_vereador. -- Esse aqui acelera apuração por tipo de voto (favor/contra/abstencao). CREATE INDEX idx_votos_materia_voto ON votos (sessao_materia_id, voto); /* --------------------------- 4) quorum (contar presentes por sessão) Normalmente: WHERE sessao_id=? AND presente=1 ---------------------------- */ -- Você tem idx_quorum_sessao_vereador, mas ele não ajuda tanto no presente=1. CREATE INDEX idx_quorum_sessao_presente ON quorum (sessao_id, presente); /* --------------------------- 5) pedidos_fala (fila de fala por sessão) Normalmente: WHERE sessao_id=? AND status='pendente' ORDER BY created_at ASC ---------------------------- */ -- Você já tem idx_pf_sessao_status (sessao_id,status). -- Este aqui deixa a fila ordenada muito mais rápida. CREATE INDEX idx_pf_sessao_status_created ON pedidos_fala (sessao_id, status, created_at, id); -- Se você usa "autorizada" e precisa pegar a fala ativa atual: CREATE INDEX idx_pf_sessao_autorizada_inicio ON pedidos_fala (sessao_id, status, tempo_inicio); /* --------------------------- 6) materias (busca por número/ano/tipo e listagens) Normalmente: WHERE ano=? AND tipo=? AND numero=? ---------------------------- */ CREATE INDEX idx_materias_tipo_ano_numero ON materias (tipo, ano, numero); -- Se você lista por autor dentro do ano/tipo CREATE INDEX idx_materias_autor_ano ON materias (autor_id, ano); /* --------------------------- 7) atas (já ok) unique(sessao_id) já resolve 100%. ---------------------------- */ /* --------------------------- 8) auditoria / events (já ok) auditoria: idx_usuario, idx_created_at já existem. events: idx_created_at e idx_type já existem. ---------------------------- */ /* ========================================================== LIMPEZA OPCIONAL (não é obrigatório) Você tem índices duplicados em sessoes: - idx_sessoes_status (status) - idx_sessao_status (status) Mantenha um só (economiza escrita/espaco). Só faça se você tiver certeza e em horário seguro. ========================================================== */ -- DROP INDEX idx_sessao_status ON sessoes; -- opcional