





SQL调优详细过程:
快行出行平台的订单处理系统优化实战



part NB



1. 问题发现





现象描述:
1.订单创建响应时间延长:
2.数据库连接数激增:
3.慢查询增多:
4.高锁等待:
发现途径:
1.应用性能监控(APM)工具:
2.数据库慢查询日志:
3.应用日志分析:





2. 问题排查





使用的工具和方法:
A. Navicat:
1. 慢查询日志分析:
2. EXPLAIN分析:
B. MySQL Performance Schema:
根本原因分析:
1.缺失复合索引:
2.查询语句不优化:
3.数据库配置不合理:





3. 问题解决



优化措施:

1. 添加和优化索引
创建复合索引:
CREATE INDEX idx_user_status_created ON orders (user_id, order_status, created_at);原因:复合索引覆盖了查询中的多个过滤条件,提高了查询效率,避免全表扫描。字段顺序按照查询条件的选择性和使用频率排列。
优化现有索引:

删除冗余的单列索引,减少索引维护开销,提升写操作性能。

DROP INDEX idx_user_id ON orders;DROP INDEX idx_order_status ON orders;

2. 重写查询语句
避免使用SELECT \*:
SELECT order_id, user_id, order_status, created_atFROM ordersWHERE user_id = ? AND order_status = ? AND created_at >= ?;

原因:仅选择必要的字段,减少数据传输和I/O开销。

优化JOIN操作:
SELECT o.order_id, o.user_id, o.order_status, o.created_at, u.usernameFROM orders oJOIN users u ON o.user_id = u.idWHERE o.user_id = ? AND o.order_status = ? AND o.created_at >= ?;

原因:确保JOIN字段(o.user_id和u.id)上有索引,
减少JOIN的开销。


3. 优化数据库配置
调整InnoDB缓冲池大小:
根据服务器内存,增大innodb_buffer_pool_size至24GB:innodb_buffer_pool_size = 24G

原因:提高缓存命中率,减少磁盘I/O,提高查询性能。

调整锁等待超时时间:
增大
innodb_lock_wait_timeout至120秒:
innodb_lock_wait_timeout = 120
原因:在高并发下,适当增加锁等待时间,
减少事务因锁等待超时而回滚,提升系统稳定性。




4. 应用层优化




使用Redis缓存:


缓存热门订单数据和用户的订单记录,减少数据库的读取压力。


设计示例:

// 获取用户的订单列表public List<Order> getUserOrders(Long userId) {String cacheKey = "user:" + userId + ":orders";// 尝试从Redis缓存中获取List<Order> orders = redisTemplate.opsForList().range(cacheKey, 0, -1);if (orders == null || orders.isEmpty()) {// 缓存未命中,从数据库查询orders = ordersMapper.findByUserId(userId);if (orders != null && !orders.isEmpty()) {// 将查询结果存入缓存,设置过期时间redisTemplate.opsForList().rightPushAll(cacheKey, orders);redisTemplate.expire(cacheKey, 1, TimeUnit.HOURS);}}return orders;}// 更新用户的订单数据public void updateUserOrders(Long userId, List<Order> updatedOrders) {// 更新数据库ordersMapper.updateOrders(updatedOrders);// 删除缓存,使下次读取时重新加载最新数据String cacheKey = "user:" + userId + ":orders";redisTemplate.delete(cacheKey);}

原因:通过Redis缓存频繁读取但不常更新的数据,
减少数据库负载,提升系统响应速度。



实施效果:
1. 预期效果:
2. 实际效果:








END
原文作者:IT枫斗者;如有侵权,请联系管理员删除。