SQL必知必会
陈旸
清华大学计算机博士
立即订阅
10179 人已学习
课程目录
已完结 49 讲
0/4登录后,你可以任选4讲全文学习。
开篇词 (1讲)
开篇词丨SQL可能是你掌握的最有用的技能
免费
第一章:SQL语法基础篇 (19讲)
01丨了解SQL:一门半衰期很长的语言
02丨DBMS的前世今生
03丨学会用数据库的方式思考SQL是如何执行的
04丨使用DDL创建数据库&数据表时需要注意什么?
05丨检索数据:你还在SELECT * 么?
06丨数据过滤:SQL数据过滤都有哪些方法?
07丨什么是SQL函数?为什么使用SQL函数可能会带来问题?
08丨什么是SQL的聚集函数,如何利用它们汇总表的数据?
09丨子查询:子查询的种类都有哪些,如何提高子查询的性能?
10丨常用的SQL标准有哪些,在SQL92中是如何使用连接的?
11丨SQL99是如何使用连接的,与SQL92的区别是什么?
12丨视图在SQL中的作用是什么,它是怎样工作的?
13丨什么是存储过程,在实际项目中用得多么?
14丨什么是事务处理,如何使用COMMIT和ROLLBACK进行操作?
15丨初识事务隔离:隔离的级别有哪些,它们都解决了哪些异常问题?
16丨游标:当我们需要逐条处理数据时,该怎么做?
17丨如何使用Python操作MySQL?
18丨SQLAlchemy:如何使用Python ORM框架来操作MySQL?
19丨基础篇总结:如何理解查询优化、通配符以及存储过程?
第二章:SQL性能优化篇 (18讲)
20丨当我们思考数据库调优的时候,都有哪些维度可以选择?
21丨范式设计:数据表的范式有哪些,3NF指的是什么?
22丨反范式设计:3NF有什么不足,为什么有时候需要反范式设计?
23丨索引的概览:用还是不用索引,这是一个问题
24丨索引的原理:我们为什么用B+树来做索引?
25丨Hash索引的底层原理是什么?
26丨索引的使用原则:如何通过索引让SQL查询效率最大化?
27丨从数据页的角度理解B+树查询
28丨从磁盘I/O的角度理解SQL查询的成本
29丨为什么没有理想的索引?
30丨锁:悲观锁和乐观锁是什么?
31丨为什么大部分RDBMS都会支持MVCC?
32丨查询优化器是如何工作的?
33丨如何使用性能分析工具定位SQL执行慢的原因?
34丨答疑篇:关于索引以及缓冲池的一些解惑
35丨数据库主从同步的作用是什么,如何解决数据不一致问题?
36丨数据库没有备份,没有使用Binlog的情况下,如何恢复数据?
37丨SQL注入:你的SQL是如何被注入的?
第三章:认识DBMS (7讲)
38丨如何在Excel中使用SQL语言?
39丨WebSQL:如何在H5中存储一个本地数据库?
40丨SQLite:为什么微信用SQLite存储聊天记录?
41丨初识Redis:Redis为什么会这么快?
42丨如何使用Redis来实现多用户抢票问题
43丨如何使用Redis搭建玩家排行榜?
44丨DBMS篇总结和答疑:用SQLite做词云
第四章:SQL项目实战 (3讲)
45丨数据清洗:如何使用SQL对数据进行清洗?
46丨数据集成:如何对各种数据库进行集成和转换?
47丨如何利用SQL对零售数据进行分析?
结束语 (1讲)
结束语 | 互联网的下半场是数据驱动的时代
SQL必知必会
登录|注册

33丨如何使用性能分析工具定位SQL执行慢的原因?

陈旸 2019-08-26
在上一篇文章中,我们了解了查询优化器,知道在查询优化器中会经历逻辑查询优化和物理查询优化。需要注意的是,查询优化器只能在已经确定的情况下(SQL 语句、索引设计、缓冲池大小、查询优化器参数等已知的情况)决定最优的查询执行计划。
但实际上 SQL 执行起来可能还是很慢,那么到底从哪里定位 SQL 查询慢的问题呢?是索引设计的问题?服务器参数配置的问题?还是需要增加缓存的问题呢?今天我们就从性能分析来入手,定位导致 SQL 执行慢的原因。
今天的内容主要包括以下几个部分:
数据库服务器的优化分析的步骤是怎样的?中间有哪些需要注意的地方?
如何使用慢查询日志查找执行慢的 SQL 语句?
如何使用 EXPLAIN 查看 SQL 执行计划?
如何使用 SHOW PROFILING 分析 SQL 执行步骤中的每一步的执行时间?

数据库服务器的优化步骤

当我们遇到数据库调优问题的时候,该如何思考呢?我把思考的流程整理成了下面这张图。
整个流程划分成了观察(Show status)和行动(Action)两个部分。字母 S 的部分代表观察(会使用相应的分析工具),字母 A 代表的部分是行动(对应分析可以采取的行动)。
我们可以通过观察了解数据库整体的运行状态,通过性能分析工具可以让我们了解执行慢的 SQL 都有哪些,查看具体的 SQL 执行计划,甚至是 SQL 执行中的每一步的成本代价,这样才能定位问题所在,找到了问题,再采取相应的行动。
取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《SQL必知必会》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(9)

  • 老毕
    如果两表关联查询,可以这样理解:

    1. ref - 双层循环,直到找出所有匹配。
    2. eq_ref - 双层循环,借助索引的唯一性,找到匹配就马上退出内层循环。
    3. const: 单层循环。

    按照循环次数递减的顺序排列它们,应该是 ref > eq_ref > const,循环次数越少,查询效率越高。

    作者回复: 对的,所以效率上来说一般是 ref < eq_ref < const

    2019-08-26
    10
  • leslie
    explain看的东西不止这点吧:老师是不是针对错了DB,至少现实生产这点东西的定位完全不够;老师在生产中不看表的状态就做explain么?如果表的DML过高的话,explain的操作完全没有价值。
         如果一张表的自增跑到了100万,数据量只有10万;说明这张表可能已经损坏了,第一步就是修复表而不是一开始做explain。就像我们拿到一台设备不是先去测功能,首先应当坚持设备是否完全OK再去测试,数据库不可能拿到的是一张全新的表;首先应当是表的性能评估,然后再说相关的检查吧。
           个人觉得今天的讲解的时候漏了真正的第一步:设备没坚持就开始检查设备性能了。
        
    2019-08-27
    6
  • 大牛凯
    SHOW PROFILE还会再有细致一点的说明么?一般看到都是sending data这个时间最长,不知道包含了哪些具体操作在里面?

    作者回复: 一般来说sending data相比于其他部分会比较长。你也可以查看不同的模块时间,比如SHOW PROFILE cpu,block_io for query ...

    2019-08-27
    2
  • 安静的boy
    index_merge的那个例子中,查询的type怎么是ref
    2019-08-26
    2
  • 土土人
    oracle是否有对应工呢?
    2019-08-26
    1
  • law
    生产环境遇到一种情况,有两个组合索引:coupon_code(tenant_id,coupon_code,platforms), idx_eq_coupon8(tenant_id,end_date,state),有个查询条件按照第二个组合索引的条件查询,但没有用到第二个索引,而是用到了第一个,麻烦老师帮忙分析下这种情况怎么定位什么原因?
    2019-08-28
  • Jack 乐
    老师,你好!百万级大表创建联合索引,导致阻塞现象,如何解决?
    2019-08-28
  • 听雨
    用EXPLAIN查看SQL执行顺序:如果SQL使用EXISTS嵌套子查询,按说,执行顺序是先执行主查询,再执行子查询,但是EXPLAIN出来的结果是主查询的id为1,子查询的id为2,也就是说是先执行的子查询,这是为什么呢
    2019-08-27
  • 许童童
    你可以讲一下 ref、eq_ref 和 const 这三种类型的区别吗?查询效率有何不同?
    ref 是使用了非唯一索引
    eq_ref 是使用了主键或唯一索引,一般在两表连接查询中索引
    const 是使用了主键或唯一索引 与常量值进行比较

    查询效率 ref < eq_ref < const
    2019-08-26
收起评论
9
返回
顶部