23|10+ SQL执行性能不佳的真实案例(上)
俊达
你好,我是俊达。
在第二章 SQL 优化篇的前面几讲中,我们比较系统地学习了 MySQL 中 SQL 优化的基础知识,包括索引访问的原理、优化器成本模型、表连接的几种算法、表连接顺序的计算、子查询的优化策略。在这一讲里,我整理了工作中遇到过的十多种不同类型的 SQL 性能问题,以案例的形式来讲解 SQL 优化的一些思路。
案例一:索引缺失引起的全表扫描
这是一个非常简单的 SQL。
我们来看一下这个 SQL 的执行计划。
从这个执行计划里,我们要关注这些信息:
table:访问的表,这里是 template 表。
type:ALL,表示全表扫描。
possible_keys:这个查询没有索引可以使用。
key:查询没有使用索引。
key_len:使用到的索引长度。
rows:预估需要访问的数据,这里是 3.6 万多。
从执行计划可以看到,这个查询需要扫描 3.6 万行数据,没有任何索引可以使用。对于这种场景,我们可以给过滤性高的条件建立索引。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
1. 隐式类型转换会导致索引不可用,需要在建表时选择精确的字段类型,保持不同表中相同业务字段的类型和字符集一致,以及确保SQL中传入的参数和字段的数据类型保持一致。 2. 字符集不一致导致的隐式类型转换也会导致索引不可用,需要注意表连接时字符集的一致性,避免隐式类型转换。 3. 优化or条件的方法是改写SQL,拆分成多个部分,使用union all合并数据,以帮助优化器找到更好的执行计划。 4. 在遇到执行计划选择了错误的索引时,可以考虑使用force index强制索引,但这可能存在潜在的风险,因此需要谨慎使用。另外,也可以通过优化SQL语句的写法,帮助优化器选择更好的执行计划。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《MySQL 运维实战课》,新⼈⾸单¥59
《MySQL 运维实战课》,新⼈⾸单¥59
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(2)
- 最新
- 精选
- 陈星宇(2.11)用force index会存在如果索引名称变了,会导致sql性能发生变化。2024-10-14归属地:四川
- Frank老师,能讲下文章结尾的问题答案吗?2024-10-14归属地:四川
收起评论