1. 慢SQL优化实战指南从原理到落地作为数据库性能调优中最常见的问题之一慢SQL优化是每个开发者必须掌握的硬技能。我经历过日均千万级请求的电商系统调优也处理过单条执行超8小时的报表查询总结出一套可复用的优化方法论。本文将系统性地分享从监控发现到最终优化的完整闭环方案。2. 慢SQL的发现与定位2.1 监控工具的选择与配置生产环境推荐采用PrometheusGrafanaAlertManager的监控组合。关键配置项包括-- MySQL慢查询日志配置 slow_query_log ON long_query_time 1 -- 单位秒 log_queries_not_using_indexes ON对于Oracle数据库可通过以下SQL定期采集SELECT sql_text, executions, elapsed_time/executions avg_time FROM v$sqlarea WHERE elapsed_time/executions 1000000 -- 超过1秒的查询 ORDER BY avg_time DESC;2.2 性能基线建立建议按业务时段建立动态基线标准交易核心链路100ms运营查询1s离线报表5分钟3. 执行计划深度解析3.1 EXPLAIN实战解读重点关注以下指标type列确保至少达到range级别rows列估算扫描行数Extra列避免出现Using filesort、Using temporary3.2 索引优化策略组合索引设计要遵循最左前缀原则例如-- 优化前 SELECT * FROM orders WHERE status paid AND create_time 2023-01-01; -- 优化后索引 ALTER TABLE orders ADD INDEX idx_status_time (status, create_time);4. SQL重写技巧4.1 分页查询优化典型反例SELECT * FROM large_table LIMIT 1000000, 10;优化方案SELECT * FROM large_table WHERE id 1000000 LIMIT 10;4.2 子查询改造将相关子查询改为JOIN-- 优化前 SELECT * FROM users WHERE dept_id IN (SELECT id FROM departments WHERE status 1); -- 优化后 SELECT u.* FROM users u JOIN departments d ON u.dept_id d.id AND d.status 1;5. 数据库参数调优5.1 关键参数配置MySQL核心参数建议innodb_buffer_pool_size 总内存的70-80% innodb_log_file_size 1-2GB query_cache_size 0 -- 8.0版本已移除5.2 连接池优化推荐配置max_connections 500 wait_timeout 300 thread_cache_size 326. 架构级解决方案6.1 读写分离实现通过ProxySQL实现自动路由INSERT INTO mysql_servers(hostgroup_id,hostname,port) VALUES (10,master,3306), (20,slave1,3306), (20,slave2,3306);6.2 分库分表策略采用ShardingSphere实现水平分片spring: shardingsphere: datasource: names: ds0,ds1 sharding: tables: t_order: actual-data-nodes: ds$-{0..1}.t_order_$-{0..15}7. 实战避坑指南隐式类型转换陷阱-- 字符串字段用数字查询会导致索引失效 SELECT * FROM users WHERE phone 13800138000; -- 错误示例OR条件优化-- 优化前 SELECT * FROM products WHERE status 1 OR price 100; -- 优化后 SELECT * FROM products WHERE status 1 UNION SELECT * FROM products WHERE price 100;批量操作技巧-- 单条插入改为批量 INSERT INTO logs (content) VALUES (msg1),(msg2),(msg3);8. 性能验证方法论8.1 基准测试工具使用sysbench进行压力测试sysbench oltp_read_write \ --db-drivermysql \ --mysql-host127.0.0.1 \ --mysql-port3306 \ --mysql-usertest \ --mysql-passwordtest \ --mysql-dbsbtest \ --tables10 \ --table-size100000 \ --threads32 \ --time300 \ --report-interval10 \ run8.2 监控指标分析关键性能指标QPS/TPS波动CPU利用率磁盘IOPS锁等待时间9. 全链路优化案例某电商订单查询优化过程原始SQL执行时间4.8秒添加复合索引降至1.2秒重构SQL写法降至800ms增加查询缓存最终稳定在200ms内优化前后的执行计划对比# 优化前 ------------------------------------------------------------------------------------- | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | ------------------------------------------------------------------------------------- | 1 | SIMPLE | orders| ALL | NULL | NULL| NULL | NULL| 284736 | Using where | ------------------------------------------------------------------------------------- # 优化后 --------------------------------------------------------------------------------------- | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | --------------------------------------------------------------------------------------- | 1 | SIMPLE | orders| range | idx_composite | idx_composite| 8 | NULL | 124 | NULL | ---------------------------------------------------------------------------------------10. 持续优化体系建议建立以下机制自动化监控报警每周慢SQL评审会SQL开发规范检查版本上线前性能测试定期索引碎片整理通过这套方法我们成功将某金融系统的平均查询响应时间从2.3秒降低到280毫秒数据库服务器数量从12台缩减到4台。记住SQL优化不是一次性工作而是需要持续改进的工程实践。
阅读完成 · 觉得有帮助?