1. 优化查询语句
EXPLAIN关键字(如EXPLAIN SELECT * FROM users WHERE id = 1),查看查询的执行路径(如是否使用了索引、是否进行了全表扫描),快速定位性能瓶颈。SELECT name, email FROM users代替SELECT * FROM users)。INNER JOIN代替OUTER JOIN(OUTER JOIN性能更低);确保JOIN字段有索引,避免笛卡尔积。SELECT * FROM orders WHERE YEAR(create_time) = 2024会导致索引失效,应改为SELECT * FROM orders WHERE create_time >= '2024-01-01' AND create_time < '2025-01-01'。LIMIT减少返回行数(如SELECT * FROM products LIMIT 10)。2. 优化索引设计
WHERE、JOIN、ORDER BY、GROUP BY涉及的列(如CREATE INDEX idx_user_id ON orders(user_id))。CREATE INDEX idx_name_age ON users(name, age),查询WHERE name = 'John' AND age = 25会用到索引,但WHERE age = 25不会)。SHOW INDEX FROM table_name查看索引使用情况)。3. 调整MySQL配置参数
/etc/mysql/mysql.conf.d/mysqld.cnf(或/etc/mysql/my.cnf),用文本编辑器(如sudo nano)修改。innodb_buffer_pool_size是影响InnoDB性能的关键参数,建议设置为服务器内存的50%-70%(如16GB内存设为8GB-12GB),用于缓存数据和索引,减少磁盘IO。max_connections根据应用并发需求调整(如普通应用设为100-200,高并发应用设为500-1000),避免过多连接导致内存耗尽。query_cache_type = 1,query_cache_size = 64M),但注意:MySQL 8.0及以上版本已移除查询缓存,且对写密集型应用效果不佳。4. 定期维护数据库
ANALYZE TABLE table_name更新表的统计信息(帮助优化器选择更好的执行计划);使用OPTIMIZE TABLE table_name整理表碎片(适用于频繁更新的表,如日志表)。5. 使用硬件与工具辅助
MySQL Workbench、Percona Monitoring and Management (PMM)监控数据库性能(如查询响应时间、缓冲池命中率、锁等待),及时发现性能瓶颈。