用10个真实案列带你掌握MySQL调优

本文详细介绍了MySQL调优的步骤和10个真实案例,包括SQL优化、索引优化、大分页处理、不等于查询、复杂查询等场景,帮助开发者深入理解并提升SQL执行效率。

前言

在应用开发的早期,数据量少,开发人员开发功能时更重视功能上的实现,随着生产数据的增长,很多SQL语句开始暴露出性能问题,对生产的影响也越来越大,有时可能这些有问题的SQL就是整个系统性能的瓶颈。

SQL优化一般步骤

1、通过慢查日志等定位那些执行效率较低的SQL语句

2、explain 分析SQL的执行计划

需要重点关注type、rows、filtered、extra。

type由上至下,效率越来越高

  • ALL 全表扫描
  • index 索引全扫描
  • range 索引范围扫描,常用语<,<=,>=,between,in等操作
  • ref 使用非唯一索引扫描或唯一索引前缀扫描,返回单条记录,常出现在关联查询中
  • eq_ref 类似ref,区别在于使用的是唯一索引,使用主键的关联查询
  • const/system 单条记录,系统会把匹配行中的其他列作为常数处理,如主键或唯一索引查询
  • null MySQL不访问任何表或索引,直接返回结果

虽然上至下,效率越来越高,但是根据cost模型,假设有两个索引idx1(a, b, c),idx2(a, c),SQL为select * from t where a = 1 and b in (1, 2) order by c;如果走idx1,那么是type为range,如果走idx2,那么type是ref;当需要扫描的行数,使用idx2大约是idx1的5倍以上时,会用idx1,否则会用idx2

Extra

  • Using filesort:MySQL需要额外的一次传递,以找出如何按排序顺序检索行。通过根
### MySQL 性能优化实战案例 #### 案例背景 在一个大型电子商务平台中,数据库操作频繁且数据量庞大。随着业务增长,某些关键查询响应时间逐渐变慢,影响用户体验和系统效率。 #### 查询优化实例 针对特定 SQL 查询进行了深入分析并实施了一系列优化措施: - **索引整** 对于涉及多条线上业务的复杂查询,在 `cm_settle_partner_day_data` 表上新增了一个五列组合索引 `five_sdbac_index` ,覆盖了常用过滤条件中的五个重要字段:`status`, `dimension_value`, `business_date`, `agent_id`, 和 `cash_value` 。这使得原本需要扫描大量记录的操作得以显著加速[^4]。 ```sql ALTER TABLE cm_settle_partner_day_data ADD INDEX five_sdbac_index (status, dimension_value, business_date, agent_id, cash_value); ``` - **利用优化器提示** 使用 MySQL 5.7 版本之后引入的优化器提示功能,通过指定 `BKA` (批量键访问)等方式指导查询执行路径的选择,从而提高了读取密集型工作负载下的性能表现[^2]。 - **配置参数微** 当遇到因排序缓冲区过小而导致性能瓶颈的情况时,适当减小 `max_length_for_sort_data` 参数值可以让更多行能够在单次排序过程中完成处理,尽管这样做可能会增加额外的数据回表次数,但在资源受限的情况下不失为一种有效的折衷方案[^3]。 - **去除不必要的强制索引** 发现部分查询存在不合理的强制索引使用情况,移除这些限制后允许 MySQL 自动选择更合适的索引策略。特别是当某个高基数字段如 `merchant_id` 可作为良好区分依据时,构建相应的联合索引往往可以获得更好的效果[^5]。 经过上述一系列针对性改进措施的应用,最终实现了目标查询平均耗时减少约 80%,极大提升了整体系统的稳定性和响应速度。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值