# Guia de Otimização de Performance

## Índices Adicionados

Esta migration adiciona índices estratégicos nas tabelas mais consultadas do sistema para melhorar significativamente a performance das queries.

### Tabelas Otimizadas

#### Produtos
- `idx_products_codigo_ean`: Busca por código/EAN
- `idx_products_estoque_status`: Alertas de estoque baixo
- `idx_products_preco`: Ordenação por preço
- `idx_products_ncm_cest`: Busca fiscal

#### Vendas
- `idx_sales_orders_cliente_status`: Relatórios por cliente
- `idx_sales_orders_created_status`: Relatórios por período
- `idx_sales_orders_valor_status`: Análise de valores
- `idx_sales_order_items_order_product`: Join otimizado
- `idx_sales_payments_order_created`: Histórico de pagamentos

#### Financeiro
- `idx_contas_receber_cliente_status`: Contas por cliente
- `idx_contas_receber_vencimento_status`: Contas por vencimento
- `idx_contas_pagar_fornecedor_status`: Contas por fornecedor
- `idx_contas_pagar_vencimento_status`: Contas por vencimento
- `idx_contas_pagar_aprovacao`: Workflow de aprovação

#### Estoque
- `idx_inventory_movements_product_date`: Histórico por produto
- `idx_inventory_movements_type_date`: Movimentações por tipo
- `idx_inventory_movements_origin`: Rastreamento de origem

#### Fiscal
- `idx_nfe_entrada_fornecedor_data`: NFes por fornecedor
- `idx_nfe_entrada_status_data`: NFes por status
- `idx_nfe_entrada_chave`: Busca por chave de acesso

## Query Logger

O sistema inclui um logger de queries para monitoramento de performance:

### Habilitar Logging

```php
use Gestoreasy\Core\Database\QueryLogger;

// Habilitar com threshold de 1000ms (padrão)
QueryLogger::enable();

// Ou com threshold customizado
QueryLogger::enable(500); // 500ms
```

### Obter Estatísticas

```php
$stats = QueryLogger::getStats();
// Retorna: total, slow, avg_duration, max_duration, min_duration
```

### Obter Queries Lentas

```php
$slowQueries = QueryLogger::getSlowQueries();
```

### Obter Queries Agrupadas por SQL

```php
$grouped = QueryLogger::getQueriesBySql();
// Identifica queries duplicadas e calcula tempo total
```

## Query Profiler

Use o profiler para analisar queries individuais:

```php
use Gestoreasy\Core\Database\QueryProfiler;

// Executar e medir
$result = QueryProfiler::profile($pdo, $sql, $params);

// Verificar uso de índices
$usesIndex = QueryProfiler::checkIndexUsage($pdo, $sql, $params);

// Obter plano de execução
$explain = QueryProfiler::explain($pdo, $sql, $params);
```

## API de Performance

Endpoints disponíveis:

- `GET /api/performance/queries` - Lista queries registradas
- `GET /api/performance/queries/slow` - Queries lentas
- `GET /api/performance/queries/stats` - Estatísticas
- `GET /api/performance/queries/by-sql` - Queries agrupadas
- `POST /api/performance/queries/clear` - Limpar logs
- `GET /api/performance/cache/stats` - Estatísticas do cache
- `GET /api/performance/queue/stats` - Estatísticas das filas

## Boas Práticas

1. **Sempre use índices em WHERE, JOIN e ORDER BY**
2. **Evite SELECT *** - selecione apenas colunas necessárias
3. **Use LIMIT em queries de listagem**
4. **Evite subqueries quando possível - prefira JOINs**
5. **Use paginação para grandes datasets**
6. **Monitore queries lentas regularmente**
7. **Use cache para queries frequentes**

## Monitoramento

Execute regularmente:

```sql
-- Queries mais lentas
SELECT * FROM performance_queries 
WHERE duration_ms > 1000 
ORDER BY duration_ms DESC 
LIMIT 10;

-- Queries mais executadas
SELECT sql, COUNT(*) as count, AVG(duration_ms) as avg_duration
FROM performance_queries
GROUP BY sql
ORDER BY count DESC
LIMIT 10;
```

