# MySQL — Patterns e Anti-patterns > Conexão | Schemas | JSON | InnoDB | Otimização ## Comandos Rápidos ```bash mysql -h localhost -u root -p mydb mysql -h host -u user -p -e "SELECT NOW();" mydb mysql -h host -u user -p mydb < migration.sql ``` ## Schema Design ```sql CREATE TABLE users ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, email VARCHAR(255) NOT NULL UNIQUE, name VARCHAR(255) NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; ``` > **SEMPRE** `ENGINE=InnoDB` — transações, FK, row-level locking. `utf8mb4` — suporta emoji e acentos completos. ## JSON Ops ```sql CREATE TABLE orders ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, metadata JSON, FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE ); SELECT * FROM orders WHERE JSON_EXTRACT(metadata, '$.source') = 'web'; -- Shorthand (MySQL 8+): SELECT * FROM orders WHERE metadata->>'$.source' = 'web'; ``` ## Indexes ```sql -- Index composto CREATE INDEX idx_orders_user_id ON orders(user_id); -- Índice parcial (simulado com generated column + índice) ALTER TABLE orders ADD COLUMN is_active TINYINT(1) GENERATED ALWAYS AS (status != 'cancelled') STORED; CREATE INDEX idx_orders_active ON orders(is_active); ``` ## Joins e Agregações ```sql SELECT u.name, o.total, o.status FROM users u INNER JOIN orders o ON o.user_id = u.id WHERE o.created_at > '2026-01-01' ORDER BY o.total DESC LIMIT 10; SELECT status, COUNT(*) AS cnt, SUM(total) AS revenue FROM orders GROUP BY status HAVING cnt > 5; ``` ## Diferenças principais vs PostgreSQL | Aspecto | MySQL | PostgreSQL | |---------|-------|-------------| | Auto-increment | `AUTO_INCREMENT` | `SERIAL` / `IDENTITY` | | UUID padrão | Requer plugin (não padrão) | `uuid-ossp` built-in | | JSON | `JSON` type (baixa performance em queries) | `JSONB` indexável | | CTEs | Suportado (MySQL 8+) | Nativo desde sempre | | Window Functions | MySQL 8+ | Nativo | | Transactions | InnoDB obrigatório | Sempre | | Null-safe join | `<=>` (spaceship operator) | `IS NOT DISTINCT FROM` |