Use `EXPLAIN` or `EXPLAIN ANALYZE` to find full table scans, bad joins, and filesorts
Add indexes on columns used in `WHERE`, `JOIN`, `ORDER BY`, and `GROUP BY`
Use composite indexes that match the query pattern
Remove unused or redundant indexes
Avoid `SELECT *`; select only needed columns
Rewrite queries to be more selective and simpler
Filter rows as early as possible
Avoid functions on indexed columns in `WHERE` clauses
Use proper join conditions and join only necessary tables
Replace correlated subqueries with joins or derived tables when appropriate
Limit result sets with `LIMIT` when possible
Optimize `ORDER BY` and `GROUP BY` to use indexes
Use covering indexes for frequent read queries
Update table statistics with `ANALYZE TABLE`
Partition very large tables when appropriate
Archive or purge old data
Check for lock contention and long transactions
Keep transactions short
Use the correct storage engine and row format
Tune MySQL configuration settings such as buffer pool size, query cache alternatives, and sort/join buffers
Enable and review the slow query log
Cache frequent query results at the application layer
Avoid N+1 query patterns
Batch inserts, updates, and deletes
Use prepared statements for repeated queries
Normalize where needed, denormalize where beneficial
Review schema data types and use the smallest practical types
Avoid leading wildcards in `LIKE` patterns
Rebuild fragmented tables when needed
Upgrade MySQL to a newer supported version
Monitor CPU, disk I/O, memory, and connection usage
