workspace/projects/gamilit/docs/02-fase-robustecimiento/EMR-001-migracion-bd/tareas/03-documentacion/INDICES-PARTE-1.md
rckrdmrd ea1879f4ad feat: Initial workspace structure with multi-level Git configuration
- Configure workspace Git repository with comprehensive .gitignore
- Add Odoo as submodule for ERP reference code
- Include documentation: SETUP.md, GIT-STRUCTURE.md
- Add gitignore templates for projects (backend, frontend, database)
- Structure supports independent repos per project/subproject level

Workspace includes:
- core/ - Reusable patterns, modules, orchestration system
- projects/ - Active projects (erp-suite, gamilit, trading-platform, etc.)
- knowledge-base/ - Reference code and patterns (includes Odoo submodule)
- devtools/ - Development tools and templates
- customers/ - Client implementations template

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-08 10:44:23 -06:00

6.9 KiB

Índices y Optimización - Parte 1: Índices Principales

Épica: EMR-001 - Migración y Robustecimiento de BD Fecha: 2025-11-02 Origen: /docs/03-desarrollo/base-de-datos/INDICES-Y-OPTIMIZACION.md


Resumen Ejecutivo

  • Total de Índices: 150+
  • Índices B-Tree: ~100
  • Índices GIN (JSONB/Arrays): ~20
  • Índices Full-Text Search: 3 (español)
  • Índices Parciales: ~15
  • Vistas Materializadas: 1 (leaderboards)

1. Tipos de Índices

1.1 B-Tree (Default)

Uso: Claves primarias, foreign keys, búsquedas de igualdad y rangos

1.2 GIN (Generalized Inverted Index)

Uso: JSONB, arrays, full-text search

1.3 Partial Indexes

Uso: Queries con WHERE clauses selectivas

1.4 Composite Indexes

Orden: Equality → Range → Sort


2. Índices de Autenticación

2.1 auth_management.profiles

-- Básicos
CREATE INDEX idx_profiles_email ON profiles(email);
CREATE INDEX idx_profiles_tenant_id ON profiles(tenant_id);
CREATE INDEX idx_profiles_role ON profiles(role);

-- Compuestos
CREATE INDEX idx_profiles_tenant_role_status
    ON profiles(tenant_id, role, status);

-- Parciales (CRÍTICO para login)
CREATE INDEX idx_profiles_email_status
    ON profiles(email, status)
    WHERE status = 'active';

-- JSONB
CREATE INDEX idx_profiles_preferences_gin
    ON profiles USING GIN(preferences);

Query optimizado:

-- Login de usuario activo
SELECT * FROM profiles
WHERE email = ? AND status = 'active';
-- Usa: idx_profiles_email_status (partial index)

2.2 auth_management.user_sessions

-- Sesiones activas
CREATE INDEX idx_user_sessions_active
    ON user_sessions(is_active)
    WHERE is_active = true;

CREATE INDEX idx_sessions_active_recent
    ON user_sessions(user_id, last_activity_at DESC)
    WHERE is_active = true;

2.3 auth_management.auth_attempts

-- SEGURIDAD: Rate limiting
CREATE INDEX idx_auth_attempts_failed
    ON auth_attempts(email, attempted_at)
    WHERE success = false;

Query de seguridad:

-- Detectar intentos fallidos (últimos 15 min)
SELECT COUNT(*) FROM auth_attempts
WHERE email = ? AND success = false
  AND attempted_at > NOW() - INTERVAL '15 minutes';
-- Usa: idx_auth_attempts_failed

3. Índices de Gamificación

3.1 gamification_system.user_stats

-- Leaderboards
CREATE INDEX idx_user_stats_level
    ON user_stats(level DESC);

CREATE INDEX idx_user_stats_ml_coins
    ON user_stats(ml_coins DESC);

CREATE INDEX idx_user_stats_current_streak
    ON user_stats(current_streak DESC);

-- Por organización
CREATE INDEX idx_user_stats_tenant_level
    ON user_stats(tenant_id, level DESC);

Queries optimizados:

-- Top 10 por nivel global
SELECT * FROM user_stats ORDER BY level DESC LIMIT 10;
-- Usa: idx_user_stats_level

-- Top 10 por nivel en tenant
SELECT * FROM user_stats
WHERE tenant_id = ? ORDER BY level DESC LIMIT 10;
-- Usa: idx_user_stats_tenant_level

3.2 gamification_system.user_ranks

CREATE INDEX idx_user_ranks_current_rank
    ON user_ranks(current_rank);

CREATE INDEX idx_user_ranks_is_current
    ON user_ranks(is_current)
    WHERE is_current = true;

3.3 gamification_system.achievements

CREATE INDEX idx_achievements_category
    ON achievements(category);

CREATE INDEX idx_achievements_is_active
    ON achievements(is_active)
    WHERE is_active = true;

-- JSONB
CREATE INDEX idx_achievements_conditions_gin
    ON achievements USING GIN(conditions);

3.4 gamification_system.user_achievements

-- Notificaciones de recompensas no reclamadas
CREATE INDEX idx_user_achievements_unclaimed
    ON user_achievements(user_id)
    WHERE is_completed = true AND rewards_claimed = false;

Query optimizado:

-- Achievements completados sin reclamar
SELECT * FROM user_achievements
WHERE user_id = ? AND is_completed = true AND rewards_claimed = false;
-- Usa: idx_user_achievements_unclaimed

3.5 gamification_system.ml_coins_transactions

-- Historial de transacciones
CREATE INDEX idx_ml_transactions_user_date
    ON ml_coins_transactions(user_id, created_at DESC);

-- Auditoría
CREATE INDEX idx_ml_transactions_reference
    ON ml_coins_transactions(reference_id, reference_type);

-- Por tipo
CREATE INDEX idx_ml_transactions_user_type_date
    ON ml_coins_transactions(user_id, transaction_type, created_at DESC);

Queries optimizados:

-- Historial (últimos 30 días)
SELECT * FROM ml_coins_transactions
WHERE user_id = ? AND created_at > NOW() - INTERVAL '30 days'
ORDER BY created_at DESC;
-- Usa: idx_ml_transactions_user_date

-- Transacciones relacionadas a ejercicio
SELECT * FROM ml_coins_transactions
WHERE reference_type = 'exercise' AND reference_id = ?;
-- Usa: idx_ml_transactions_reference

4. Índices de Contenido Educativo

4.1 educational_content.modules

-- Listado ordenado
CREATE INDEX idx_modules_order_index
    ON modules(order_index);

-- Parciales (CRÍTICO para catálogo público)
CREATE INDEX idx_modules_active_published
    ON modules(order_index)
    WHERE is_published = true AND status = 'published';

-- Arrays
CREATE INDEX idx_modules_prerequisites_gin
    ON modules USING GIN(prerequisites);

CREATE INDEX idx_modules_tags_gin
    ON modules USING GIN(tags);

-- JSONB
CREATE INDEX idx_modules_content_gin
    ON modules USING GIN(content);

-- Full-Text Search (español)
CREATE INDEX idx_modules_search
    ON modules
    USING GIN(to_tsvector('spanish',
        coalesce(title, '') || ' ' || coalesce(description, '')));

Queries optimizados:

-- Catálogo público
SELECT * FROM modules
WHERE is_published = true AND status = 'published'
ORDER BY order_index;
-- Usa: idx_modules_active_published

-- Búsqueda full-text
SELECT * FROM modules
WHERE to_tsvector('spanish', title || ' ' || description)
      @@ to_tsquery('spanish', 'marie & curie');
-- Usa: idx_modules_search

4.2 educational_content.exercises

-- Por módulo y tipo
CREATE INDEX idx_exercises_module_type_active
    ON exercises(module_id, exercise_type, is_active);

-- Parciales (ejercicios auto-evaluables)
CREATE INDEX idx_exercises_active_gradable
    ON exercises(module_id, order_index)
    WHERE is_active = true AND auto_gradable = true;

-- JSONB
CREATE INDEX idx_exercises_content_gin
    ON exercises USING GIN(content);

CREATE INDEX idx_exercises_config_gin
    ON exercises USING GIN(config);

-- Full-Text Search (español)
CREATE INDEX idx_exercises_search
    ON exercises
    USING GIN(to_tsvector('spanish',
        coalesce(title, '') || ' ' || coalesce(description, '')));

5. Referencias

  • Parte 2: INDICES-PARTE-2.md (Progress Tracking, Social, Auditoría)
  • Esquema: ESQUEMA-44-TABLAS.md
  • Migraciones: ../01-migraciones/MIGRACIONES-HISTORICO.md

Última actualización: 2025-11-02 Consolidado por: ARTEMIS (Agente de Migración)