MySQL 运维实战课
张新铭(俊达)
云掣科技资深数据库专家,前淘宝网、支付宝数据库专家
875 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已更新 25 讲/共 41 讲
MySQL 运维实战课
15
15
1.0x
00:00/00:00
登录|注册

23|10+ SQL执行性能不佳的真实案例(上)

你好,我是俊达。
在第二章 SQL 优化篇的前面几讲中,我们比较系统地学习了 MySQL 中 SQL 优化的基础知识,包括索引访问的原理、优化器成本模型、表连接的几种算法、表连接顺序的计算、子查询的优化策略。在这一讲里,我整理了工作中遇到过的十多种不同类型的 SQL 性能问题,以案例的形式来讲解 SQL 优化的一些思路。

案例一:索引缺失引起的全表扫描

这是一个非常简单的 SQL。
SELECT *
FROM template
WHERE templet_id = 2 AND status = 1
我们来看一下这个 SQL 的执行计划。
从这个执行计划里,我们要关注这些信息:
table:访问的表,这里是 template 表。
type:ALL,表示全表扫描。
possible_keys:这个查询没有索引可以使用。
key:查询没有使用索引。
key_len:使用到的索引长度。
rows:预估需要访问的数据,这里是 3.6 万多。
从执行计划可以看到,这个查询需要扫描 3.6 万行数据,没有任何索引可以使用。对于这种场景,我们可以给过滤性高的条件建立索引。
alter table template
add key idx_templateid_status(templet_id, status);
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
  • 解释
  • 总结

1. 隐式类型转换会导致索引不可用,需要在建表时选择精确的字段类型,保持不同表中相同业务字段的类型和字符集一致,以及确保SQL中传入的参数和字段的数据类型保持一致。 2. 字符集不一致导致的隐式类型转换也会导致索引不可用,需要注意表连接时字符集的一致性,避免隐式类型转换。 3. 优化or条件的方法是改写SQL,拆分成多个部分,使用union all合并数据,以帮助优化器找到更好的执行计划。 4. 在遇到执行计划选择了错误的索引时,可以考虑使用force index强制索引,但这可能存在潜在的风险,因此需要谨慎使用。另外,也可以通过优化SQL语句的写法,帮助优化器选择更好的执行计划。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《MySQL 运维实战课》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • 陈星宇(2.11)
    用force index会存在如果索引名称变了,会导致sql性能发生变化。
    2024-10-14归属地:四川
  • Frank
    老师,能讲下文章结尾的问题答案吗?
    2024-10-14归属地:四川
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部