《MySQL实战45讲》学习小结(应用篇)

丁奇老师《MySQL实战45讲》的学习小结

第一篇:基础概念

第二篇:运维管理

第三篇:合理使用MySQL

题目很大,写得出来的很少 -_-!

把自己的理解梳理出一个提纲,作为一个速查手册吧。

第一部分:sql优化

1. 了解一个sql如何被执行

最重要的是搞清楚MySQL是如何执行一个sql命令的。

explain命令

最简单,也是最常用的:explain命令。

看看执行次序,看看是否用了索引、哪个索引、要扫描多少行记录(估算)。

OPTIMIZER_TRACE(第16讲)

可以打开optimizer_trace,只对本线程有效。

执行sql命令后,查询information_schema.OPTIMIZER_TRACE,可看到更多信息,例如一个排序语句是否使用了临时文件。

执行sql命令前后分别查询 performance_schema.session_status 表的 Innodb_rows_read 值,可以计算这个sql命令扫描了多少行记录。

慢SQL日志(第19讲)

查看慢日志sql,可查看sql的扫描行数 Rows_examined。

扫描行数可用于印证sql的执行过程,是一个比较有用的信息。

select @@slow_query_log; -- 是否开启慢日志

select @@slow_query_log_file; -- 慢日志文件路径

select @@long_query_time; -- 阈值,单位为秒,超过这个时间视为慢sql,才记录日志

2. 跟sql执行过程相关的一些概念

索引

主键索引为聚簇索引。非主键索引需回表,除非包含了sql用到的所有字段,即覆盖索引。

一般情况下,建议使用自增主键,这样非主键索引占用的空间小,存储效率和查询效率高。

建议尽量使用普通索引,少用唯一索引(第9讲)

索引的数据结构(第4讲,第5讲)

索引的基数(cardinality)(第10讲)

前缀索引、倒序存储、hash字段(第11讲)

函数索引(第37讲,5.7版本以上)

change buffer(第9讲)

如果一个业务的更新模式是写入之后马上会做查询,建议关闭 change buffer。

join(34讲,35讲)

MySQL优化器根据两个表的字段、行数(根据sql中每个表各自的条件筛选),统计数据量。以小表为驱动表,大表为被驱动表。

如果大表在join字段上有索引,适用 Index Nested-Loop Join(NLJ)算法,对小表中的每一行,从大表中查找匹配的记录,形成结果集。

如果大表在join字段上没有索引,适用 Block Nested-Loop Join 算法,先把小表读入 join_buffer,然后扫描大表,对于大表的每一行,跟join_buffer中的数据进行匹配,形成结果集。如果小表的数据不能一次性全部读入 join_buffer,需要分批读入,则需要多次扫描大表。

sort_buffer(16讲,17讲)

mysql提供了两种排序方法:全字段排序 和 rowid排序。

全字段排序:将结果集及排序所需的所有字段载入 sort_buffer,进行排序。如果数据量超出buffer size,需要用到临时文件做归并排序。

rowid排序:只把满足条件的排序字段和主键字段载入 sort_buffer,排序后,根据主键,逐行回表获取数据,组成结果集。如果sort_buffer装不下,也要用临时文件辅助排序。但rowid排序需载入内容的数量小,能载入更多行,需要文件辅助排序的概率小。

MySQL优先选择全字段排序。

内部临时表(第37讲)

执行union语句、group by语句时,MySQL会自动创建内部临时表,存储中间数据,并进行排序、计数、sum、去重等操作。

内存临时表默认大小为16M,如果超出这个大小,就会转成磁盘临时表,默认使用InnoDB引擎。

group by 语句如果能用上索引,就可以免去排序这个过程。

外部临时表(第35讲,36讲)

create temporary table,只对当前连接有效。read-only,也可以使用。

多用于优化join,减少对大表的扫描次数,应用 NLJ 或 BKA 算法。

如果binlog格式为statement/mixed,记录临时表相关操作。如果格式为row,不会记录。

3. sql优化

sql优化,没啥固定的招式。自己的体会,比较重要的是3条:

  1. 了解sql执行原理,了解导致sql慢的原因和常见的应对方法,了解每种方法的代价

  2. 不要踩坑,比如:条件字段函数操作、隐式类型转换、隐式字符编码转换(第18讲)。这个有切肤之痛。有个sql,要查某一天的订单,小伙伴写了 date(...)=xxx,没做好code review,就这样上线了,第二天早上一起量,整个系统就挂了。。。

  3. 做好code review,做好慢sql监控,多用explain等方式检查执行计划,不要偷懒

第二部分:数据库配置和运维

作为数据库的使用者,我希望运维来管理和处理哪些问题?

如果我负责数据库的运维,会怎样设置优先级,哪些能独立完成,哪些需要其他岗位的配合?

对于数据库来说,正常情况下 “数据可靠性” > “系统可用性” > 优先,运维要做的是在数据可靠的基础上,尽量提高可用性。

为了达成这个目的,监控必不可少。做好应对问题的预案、定期演练,很重要。

1. 数据可靠性

日志的“双1”设置(第23讲)

innodb_flush_log_at_trx_commit = 1,每次事务的 redo log 都直接持久化。

sync_binlog = 1,每次事务的 binlog 都直接持久化。

关联的还有2个参数:

binlog_group_commit_sync_delay

binlog_group_commit_sync_no_delay_count

这两个参数跟数据可靠性无关。在磁盘IO成为瓶颈的情况下,可结合syn_binlog来提升可用性。

binlog格式(第24讲)

三种格式:statement, row, mixed。

row格式,能更好地保障主库和从库之间(特别注意主备切换过程)的数据一致性。

代价是磁盘空间

参考设置:

binlog_format = row

binlog_row_image = FULL

GTID(第27讲)

用于解决“一主多从”结构下,主备切换时,新的主库和从库之间的数据同步。

备份

这个无需多说

版本

尽量升到高版本。

5.6版本引入GTID、并行复制,5.7版本引入SQL动态重写。

semi-sync(第28讲)

主库在结束一个事务之前,等待至少一个从库收到binlog的response。

可避免主库在完成事务,但尚未向从库发送binlog时损毁,导致的数据丢失。

对可用性的影响较大,不建议打开。

2. 可用性:正常使用

磁盘IO(第12讲)

innodb_io_capacity,建议设为磁盘的IOPS,可用fio工具来测试

redo log文件,4个1G的文件(内存128G、innodb_io_capacity为20000的情况)

缓存相关

join_buffer, sort_buffer:根据应用场景,调整其的大小

MRR可优化join,但从教程中信息来看,MySQL似乎并不推荐,谨慎使用。(第35讲)

change buffer:根据应用场景,判断是否需要启动。

事务隔离级别(第20讲)

把binlog格式设为row,应对可以保证主从一致。

InnoDB的缺省事务隔离级别为RR。

RR的隔离性比RC好,解决了不可重复度问题和幻读问题。因为增加了gap lock,锁的数量大大增加,死锁概率升高,死锁检测也要消耗资源。一致性读也要消耗资源。

在业务允许的情况下,调整为RC,对性能有帮助。

读写分离,负载均衡(28讲)

一主多从,读写分离,这已是常规配备。

两个问题:1)如何做负载均衡,2)过期读

这里只说第一个问题,如何负载均衡。综合来看,proxy转发是比较好的选项。

在此基础上,我倾向再拿一个从库出来,让某些查询固定通过这个从库来操作,例如:数据维护操作、某些运行时间长及时性要求低的统计查询。

限制并发线程数(第29讲)

innodb_thread_concurrency,缺省为0,不限制。建议设置为 64~128 之间的值(或CPU核数的2倍)。

分库

划分业务领域,拆分为多个库,分开存储。

这是个系统工程,需要业务系统开发、数据库运维合作。

3. 可用性:故障恢复

服务器故障的情况下,主要的可用性指标,是多久可以恢复可用。

全量备份 + 增量备份

全量备份越频繁,恢复时间越短,存储空间代价也越大。

主备双M配置

这个现在是常见手段,一旦主库故障,备库可以马上顶上来。

从库延迟备份

为了应对误删数据问题,可考虑采用从库延迟备份策略。

检测数据库是否出问题(29讲)

有了这些备份,还需要做好监控,尽早判断服务器是否故障。

推荐用update 系统表 + performance_schema 这种方式(打开performace_schema有10%性能损失,19讲)。

4. 监控

监控,必须单独拿出来写一下。

  • 常规要监控的:

  • 长事务

  • 慢sql

  • 主从延迟

  • 锁等待

  • 执行次数

  • update系统表 + performance_schema

做好监控和报警,才能心中不慌。

以上几条,都是按“数据可靠性”>“系统可用性”来考虑的。

实际中也会遇到服务器故障、短时间压力峰值等情况,需要优先保证系统的可用,可在一段时间内,容忍少量数据错误。这种情况下,需要调整策略。

以后如果有了实战经验,再总结。

在课程中,有几讲实战性特别强,遇到相关问题,可以先看下:

- 避免长事务,第3讲,思考题

- 降低锁冲突,第7讲,内容及思考题

- 字符串字段索引,第11讲,思考题及网友留言

- 业务高峰,MySQL压力太大的应对,第22讲,内容及网友留言

- 有损设置及其应对,第23讲,思考题及网友留言

- 误删数据后的恢复,第31讲,内容及网友留言,各种血泪

系统运维要做好,首选是预防问题,其次是监控,争取在用户感知之前发现问题解决问题,最后没办法了才是问题的暴露和应对。

平时下功夫,才能少出问题,遇到问题才能快速应对:

  • sql review(包括建索引)

  • 监控:长事务、慢sql、主从延迟......

  • 设立和推行规范:删数据、删字段、加字段、删表

  • 问题处理工具化,定期演练

再推而广之,系统的设计、开发,都要把工作做在前面,多问几个为什么,把原理搞清楚,把逻辑搞清楚。不断学习,不断总结,才能不断提高。

本文内容为丁奇老师《MySQL实战45讲》的学习笔记,只是一个提纲。

这门课程的内容和组织方式,每一讲的思考题、大家的留言、老师的点评,都非常棒。

强烈推荐!

极客时间 - MySQL实战45讲

黄鹤

2019-12-11

阅读终点,创作起航,您可以撰写心得或摘录文章要点写篇博文。去创作
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
### 回答1: MySQL 45是由杨恒宇老师主MySQL数据库前沿技术课程,包括了MySQL的各个方面的知识点和实践经验。以下是MySQL 45的思维导图内容: 1. MySQL架构基础 - 架构介绍:Server层和存储引擎层 - 连接管理器和连接池 - SQL解析和查询优化 2. InnoDB存储引擎 - InnoDB架构和特性 - 事务和锁机制 - MVCC多版本并发控制 - InnoDB存储引擎的存储结构和索引原理 3. SQL优化 - 查询性能优化 - 索引优化和建立原则 - 慢查询分析和优化 - Explain和性能分析工具的使用 4. 高性能索引 - B+树索引和Hash索引 - 索引的数据结构和存储原理 - 聚簇索引和辅助索引 - 全文索引和空间索引 5. 事务隔离和并发控制 - ACID特性和事务隔离级别 - 死锁和锁粒度 - 乐观锁和悲观锁机制 - 并发控制算法:读写锁和多版本并发控制 6. 复制和高可用 - 主从复制和读写分离 - 二进制日志和GTID - 基于半同步复制的高可用解决方案 - 高可用架构设计原则 7. InnoDB性能调优 - InnoDB存储引擎的性能调优 - 缓冲池和日志系统的优化 - 文件IO和磁盘性能的优化 - 服务器参数和配置优化 8. 分库分表 - 分库分表架构设计 - 按需扩展和数据迁移 - 分布式事务和一致性 - 分表策略和路由规则 9. 高可用集群 - 数据库架构设计和分片策略 - 自动化运维和故障恢复 - 高可用备份和恢复 - 数据一致性和性能优化 10. SQL解析和执行过程 - SQL解析器的工作原理 - 查询优化器的优化策略 - 执行引擎的执行过程 - 索引扫描和排序算法 这些是MySQL 45的主要内容和知识点,通过学习和理解这些内容,可以深入了解MySQL的架构和内部原理,并能够进行性能调优和架构设计。 ### 回答2: 《MySQL 45》是一本深入MySQL数据库的书籍,内容丰富全面,涉及了数据库基础知识、SQL语句、索引优化、事务与锁、复制原理等方面。以下是该书的思维导图。 数据库基础知识方面,该书首先介绍了MySQL的架构与特点,包括MySQL Server、存储引擎、日志、缓存等组成部分。然后详细解了MySQL的数据类型、索引原理、查询优化器、表结构设计等内容。 SQL语句方面,该书对常用的SQL语句进行了解读,包括查询、插入、更新、删除等操作。同时,还介绍了SQL语句的执行流程、优化技巧和常见的性能问题及解决方法。 索引优化方面,该书重点介绍了索引的原理与使用方法。从B+树的结构入手,详细解释了索引的创建、维护和使用,以及索引的类型和优缺点。同时,还介绍了如何通过优化SQL语句和选择合适的索引来提升查询性能。 事务与锁方面,该书全面剖析了MySQL的事务特性和隔离级别,解释了事务的概念、ACID特性和并发控制问题。同时,深入解了MySQL的锁机制,包括共享锁、排他锁、行锁、表锁等,以及如何避免死锁和提升并发性能。 复制原理方面,该书详细介绍了MySQL的复制原理和架构,包括主从复制、半同步复制、组复制等。解了复制的配置方法和常见问题的解决方法,以及如何进行备库切换和故障恢复。 通过《MySQL 45》的学习,读者将全面了解MySQL数据库的原理和使用方法,具备了解决常见性能问题和优化数据库的能力。这本书内容丰富、实用性强,非常适合MySQL开发人员和DBA阅读。 ### 回答3: 《MySQL 45》是针对MySQL数据库的一本经典著作,也是很多MySQL开发者和DBA必读的一本书。下面是对该书的思维导图总结: 该书主要分为三个部分:基础、进阶和高手。 1. 基础: - MySQL基本架构:介绍了MySQL的架构和核心组件,包括连接器、查询缓存、分析器、优化器、执行器和存储引擎等。 - 日志系统:详细介绍了MySQL的日志系统,包括重做日志(redo log)和回滚日志(undo log)的机制和使用方式。 - 事务隔离:介绍了MySQL的事务隔离级别,包括读未提交、读已提交、可重复读和串行化,以及各种级别的实现方式和影响。 - 索引:详细解了MySQL索引的数据结构和原理,包括B树、B+树和哈希索引,以及索引的使用和优化技巧。 - 查询执行流程:分析了MySQL查询的执行流程,从SQL解析到查询优化和执行的整个过程,以及各个阶段的优化方法。 - 锁机制:介绍了MySQL的锁机制,包括共享锁和排他锁的概念和使用场景,以及锁的类型和粒度。 - SQL优化:提供了SQL性能优化的一些基本策略和技巧,包括索引优化、查询重写和分表等。 2. 进阶: - 查询优化器:深入介绍了MySQL查询优化器的工作原理和使用方法,包括查询重写、索引选择和执行计划的生成等。 - 数据备份与恢复:解了MySQL数据备份和恢复的方法和工具,包括物理备份和逻辑备份,以及主从复制和增量备份等。 - 主从复制:详细介绍了MySQL的主从复制原理和使用方法,包括复制的基本流程、数据同步方式和延迟问题的解决。 - 高可用架构:提供了一些MySQL高可用架构的选择和使用方法,包括主备复制、多主复制和MGR等。 - 影子库:介绍了MySQL的影子库技术,用于在生产环境不受影响的情况下进行性能测试和数据分析。 - 对账与差异:解了MySQL数据对账和差异检测的方法和工具,以及一些常用的差异处理方式和技巧。 3. 高手: - 参数调优:详细介绍了MySQL参数调优的方法和技巧,包括修改参数值和监控参数的方式。 - 慢查询优化:解了MySQL慢查询的原因和优化方法,包括慢查询日志的分析和优化器的干预。 - SQL解析和执行:深入分析了MySQL SQL语句的解析和执行过程,包括语法解析器和执行计划的生成方式。 - 字符集与编码:介绍了MySQL的字符集和编码的原理和应用,包括字符集的选择和转换方式。 - 存储引擎:详细介绍了MySQL的存储引擎,包括InnoDB、MyISAM和Memory等,以及它们的特点和应用场景。 总结起来,《MySQL 45》是一本全面介绍MySQL数据库的著作,从基础的架构和原理到进阶的优化技巧和高级应用,涵盖了MySQL开发和管理的方方面面。无论是初学者还是经验丰富的开发者和DBA,都可以从中获得宝贵的知识和实践经验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

黄鹤

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值