MySQL Core Knowledge
Deep Knowledge: Use mcp__documentation__fetch_docs with technology: mysql for comprehensive documentation.
Table Definition
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
is_active BOOLEAN DEFAULT TRUE,
INDEX idx_email (email),
INDEX idx_created (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
Common Queries
-- Pagination
SELECT * FROM users
WHERE is_active = TRUE
ORDER BY created_at DESC
LIMIT 20 OFFSET 0;
-- Join
SELECT u.*, COUNT(p.id) as post_count
FROM users u
LEFT JOIN posts p ON p.user_id = u.id
GROUP BY u.id;
-- Upsert
INSERT INTO users (email, name)
VALUES (?, ?)
ON DUPLICATE KEY UPDATE name = VALUES(name);
Key Differences from PostgreSQL
| Feature |
MySQL |
PostgreSQL |
| Auto ID |
AUTO_INCREMENT |
SERIAL |
| Boolean |
TINYINT(1) |
BOOLEAN |
| Upsert |
ON DUPLICATE KEY |
ON CONFLICT |
| JSON |
JSON |
JSONB (indexed) |
When NOT to Use This Skill
- PostgreSQL-specific features - Use
postgresql skill for JSONB, arrays, window functions
- NoSQL operations - Use
mongodb or redis skills for document/key-value stores
- Oracle database - Use
oracle skill for Oracle-specific features
- SQL Server - Use
sqlserver skill for T-SQL and SQL Server features
- ORM abstractions - Use framework-specific skills (Prisma, TypeORM, Sequelize)
Anti-Patterns
| Anti-Pattern |
Issue |
Solution |
SELECT * in production |
Transfers unnecessary data, performance impact |
Specify needed columns explicitly |
Missing WHERE on UPDATE/DELETE |
Modifies all rows unintentionally |
Always include WHERE clause |
| Missing indexes on JOIN/WHERE columns |
Full table scans, slow queries |
Add indexes on frequently queried columns |
| MyISAM for transactional data |
No transaction support, table-level locking |
Use InnoDB engine |
LIKE '%pattern' |
Cannot use index, full scan |
Use LIKE 'pattern%' or fulltext search |
Missing LIMIT on large tables |
Can crash application |
Always paginate results |
Using ENUM for frequently changing values |
Requires ALTER TABLE to add values |
Use lookup table instead |
| Missing foreign keys |
Data integrity issues |
Define proper FK constraints |
| N+1 query problem |
One query per row in loop |
Use JOINs or batch queries |
| Not using prepared statements |
SQL injection risk, slower performance |
Use parameterized queries |
Quick Troubleshooting
| Problem |
Diagnostic |
Fix |
| Slow queries |
EXPLAIN SELECT ... |
Add indexes, rewrite query, analyze execution plan |
| High CPU usage |
SHOW PROCESSLIST to find slow queries |
Optimize top queries, add indexes |
| Connection limit reached |
SHOW STATUS LIKE 'Threads_connected' |
Increase max_connections, use connection pooling |
| Lock wait timeout |
Check SHOW ENGINE INNODB STATUS |
Reduce transaction time, optimize queries |
| Disk space full |
SELECT table_schema, SUM(data_length+index_length) FROM information_schema.tables GROUP BY 1 |
Archive old data, optimize tables |
| Replication lag |
SHOW SLAVE STATUS |
Increase resources, tune binlog settings |
| Table corruption |
CHECK TABLE table_name |
Run REPAIR TABLE or restore from backup |
| Deadlocks |
Check error log and SHOW ENGINE INNODB STATUS |
Reduce transaction scope, access tables in same order |
Reference Documentation
1---2name: mysql3description: MySQL relational database. Covers queries, indexes, and optimization. Use when working with MySQL databases. USE WHEN: user mentions "mysql", "mariadb", asks about "AUTO_INCREMENT", "ON DUPLICATE KEY UPDATE", "GROUP_CONCAT", "mysql specific syntax" DO NOT USE FOR: PostgreSQL - use `postgresql` instead, MongoDB - use `mongodb` instead, Oracle - use `oracle` instead, SQL Server - use `sqlserver` instead4---5# MySQL Core Knowledge67> **Deep Knowledge**: Use `mcp__documentation__fetch_docs` with technology: `mysql` for comprehensive documentation.89## Table Definition1011```sql12CREATE TABLE users (13 id INT AUTO_INCREMENT PRIMARY KEY,14 name VARCHAR(100) NOT NULL,15 email VARCHAR(255) UNIQUE NOT NULL,16 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,17 is_active BOOLEAN DEFAULT TRUE,18 INDEX idx_email (email),19 INDEX idx_created (created_at)20) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;21```2223## Common Queries2425```sql26-- Pagination27SELECT * FROM users28WHERE is_active = TRUE29ORDER BY created_at DESC30LIMIT 20 OFFSET 0;3132-- Join33SELECT u.*, COUNT(p.id) as post_count34FROM users u35LEFT JOIN posts p ON p.user_id = u.id36GROUP BY u.id;3738-- Upsert39INSERT INTO users (email, name)40VALUES (?, ?)41ON DUPLICATE KEY UPDATE name = VALUES(name);42```4344## Key Differences from PostgreSQL4546| Feature | MySQL | PostgreSQL |47|---------|-------|------------|48| Auto ID | `AUTO_INCREMENT` | `SERIAL` |49| Boolean | `TINYINT(1)` | `BOOLEAN` |50| Upsert | `ON DUPLICATE KEY` | `ON CONFLICT` |51| JSON | `JSON` | `JSONB` (indexed) |5253## When NOT to Use This Skill5455- **PostgreSQL-specific features** - Use `postgresql` skill for JSONB, arrays, window functions56- **NoSQL operations** - Use `mongodb` or `redis` skills for document/key-value stores57- **Oracle database** - Use `oracle` skill for Oracle-specific features58- **SQL Server** - Use `sqlserver` skill for T-SQL and SQL Server features59- **ORM abstractions** - Use framework-specific skills (Prisma, TypeORM, Sequelize)6061## Anti-Patterns6263| Anti-Pattern | Issue | Solution |64|--------------|-------|----------|65| `SELECT *` in production | Transfers unnecessary data, performance impact | Specify needed columns explicitly |66| Missing `WHERE` on UPDATE/DELETE | Modifies all rows unintentionally | Always include WHERE clause |67| Missing indexes on JOIN/WHERE columns | Full table scans, slow queries | Add indexes on frequently queried columns |68| MyISAM for transactional data | No transaction support, table-level locking | Use InnoDB engine |69| `LIKE '%pattern'` | Cannot use index, full scan | Use `LIKE 'pattern%'` or fulltext search |70| Missing `LIMIT` on large tables | Can crash application | Always paginate results |71| Using `ENUM` for frequently changing values | Requires ALTER TABLE to add values | Use lookup table instead |72| Missing foreign keys | Data integrity issues | Define proper FK constraints |73| N+1 query problem | One query per row in loop | Use JOINs or batch queries |74| Not using prepared statements | SQL injection risk, slower performance | Use parameterized queries |7576## Quick Troubleshooting7778| Problem | Diagnostic | Fix |79|---------|------------|-----|80| Slow queries | `EXPLAIN SELECT ...` | Add indexes, rewrite query, analyze execution plan |81| High CPU usage | `SHOW PROCESSLIST` to find slow queries | Optimize top queries, add indexes |82| Connection limit reached | `SHOW STATUS LIKE 'Threads_connected'` | Increase max_connections, use connection pooling |83| Lock wait timeout | Check `SHOW ENGINE INNODB STATUS` | Reduce transaction time, optimize queries |84| Disk space full | `SELECT table_schema, SUM(data_length+index_length) FROM information_schema.tables GROUP BY 1` | Archive old data, optimize tables |85| Replication lag | `SHOW SLAVE STATUS` | Increase resources, tune binlog settings |86| Table corruption | `CHECK TABLE table_name` | Run `REPAIR TABLE` or restore from backup |87| Deadlocks | Check error log and `SHOW ENGINE INNODB STATUS` | Reduce transaction scope, access tables in same order |8889## Reference Documentation90- [Indexes](quick-ref/indexes.md)91- [JSON](quick-ref/json.md)