High Performance MySQL Forth Edition

第一章 MySQL架构

逻辑架构

优化器不关心一张表使用哪个存储引擎,但是存储引擎会影响MySQL优化这个query语句。优化器从存储引擎那儿获取此存储引擎的一些能力,和一些操作的代价,作为这个表的一些统计信息。

MySQL的老版本,使用内部的查询缓存来提供查询,但随着并发的提高,查询缓存变成了一个瓶颈,从5.7.20版本开始,查询缓存被正式弃用。在8.0版本,查询缓存彻底被移除了。但查询缓存是个好的设计,许多地方都在用。

并发控制

共享锁(读锁):多个client都可以读

排它锁(写锁):一个client在写了后,其他的写和读都被阻塞。

锁粒度,数据库能控制的所粒度越小越好,锁是消耗资源的,如果数据库一直在做锁相关的事情,那么存储和查询数据的工作就没法做了。分为表锁、行锁。行锁在存储引擎实现。

事务

隔离级别:READ UNCOMMIT、READ COMMIT、REAPEATABLE READ、SERIALIZABLE

死锁:MySQL有死锁检测机制

事务日志:write-ahead logging,预写式日志

mysql的事务:自动提交。支持全局和session配置。DDL语句会触发自动提交。MySQL的事物是实现在存储引擎层的,因此一个事务不能跨2个引擎,如InnoDB和MyISAM,如果出现错误,MyISAM的事务无法回滚。尽量别用LOCK TABLES语句。

多版本控制

 MVCC不止是MySQL,Oracle、PostgreSQL等都在使用。MVCC使用某个时间点的数据快照工作。所以事务里每次查询到的数据是一致的,不同的事务之间是不同的快照,数据相互不影响。

undo log,主要用于事务的回滚,如果事务回滚,从undo log查数据。

redo log,主要用于MySQL崩溃会重做恢复,从redo log查数据恢复。

MVCC只是存在于READ COMMIT、REAPEATABLE READ这2种隔离级别下,因为其他2种隔离级别根本不需要MVCC控制。

复制

源节点为每个replica准备一个线程,线程在有写入时,会被唤醒。数据会被传送到副本节点上。

 数据文件结构

8.0版本取消了frm文件,增加了sdi文件,记录元数据

InnoDB引擎

 InnoDB是默认的MySQL存储引擎,一般情况下,使用InnoDB就行了。InnoDB使用MVCC实现高并发,并且实现了4种标准的SQL隔离级别。InnoDB使用了ext-key locking strategy防止幻读情况,而不是说仅仅锁住当前涉及到的行。索引尽量小和少。

InnoDB内有有很多优化,从磁盘预读取数据、自适应哈希索引,并自动在内存中创建,提交检索效率、使用buffer来加速insert。

InnoDB支持在线热备份,oracle的企业版MySQL备份和开源的Percona XtraBackup。

JSON在8.0版本支持的更好,允许对json字段创建多个索引。json处理的性能更好,访问更快。

在8.0,由之前表元数据存储在单独的文件,改为了使用数据目录。有利于改表这样的数据恢复。

DDL语句可以全部commit,或者全部roll back。

存储引擎的API最重要。

第二章  在可靠的引擎世界里实施监控

可靠工程对DBA团队的影响

定义服务等级目标

SLI、SLO、SLA

怎样让客户满意,平衡让客户满意和最小工作量,识别要做哪些工作,优先做哪些工作。

怎样去测量

 定义SLI和SLO

监控解决方案,购买商业服务、开源产品

测量长期的性能

 学会找到商业的流量类型规律,更高效的监控指标。使用监控工具来检查性能

总结

 延迟、可用性、容错性,是3个很重要的指标,关系到使用方的体验。其他的如连接数、磁盘空间、磁盘IO等也很重要,值得去主动监控。

第三章 performance_schema表

检测工具,包含了很多的MySQL的指标,如statement/sql/select

消费组织,sys schema 是performance_schema的一个视图,是为了更方便的查询performance_schema

早期的MySQL版本,开启了performance-schema会消耗资源,因此很多人都不开启。新版本是没问题的。我建议开启performance_schema,然后动态的开启你需要测量的数据。这会帮助你从MySQL内部定位问题。

第四章 Operating System and Hardware 

 MySQL运行的性能,取决于他运行的操作系统和硬件中最薄弱的环节。这个章节,也有助于了解文件系统限制和Linux I/O调度器。

如果内存足够多,那么就能缓存全部数据,那么所有的读操作都是在内存中的,性能以数量级的提升。但写是另外一回事,虽然缓存可以延迟写入磁盘,但迟早是要写磁盘的。

写IO的2种方式:1、多次修改数据,一次flush到磁盘。2、多个修改的数据库,IO合并后,一次flush到磁盘。

如果使用机械硬盘,那么磁盘和没存的速度比率很重要;如果使用SSD,那么这个比率就不是很重要了。

固态盘的随机读写性能比机械盘好。固态盘本身的读要比写性能好。固态盘并行能力更好,当有足够多的并行,才能达到固态盘的吞吐量。

Raid0和Raid1都是很简单的方案,大多数操作系统,都支持创建软件路由。

raid5的性能,对raid卡的依赖比较高,raid卡的缓存性能对数据库的性能影响较大。RAID5很流行。好的RAID5控制器的性能有话,可媲美RAID10。但raid5就是很流行。

Raid磁盘组需要被监控,不能等到第2块盘坏的时候,才处理,那时就迟了,无法恢复数据了。如果磁盘多,可以给Raid设置热备。除了监视驱动器的故障之外,还应该监视RAID控制器的电池备份单元和写缓存策略。

Raid有2个重要的参数 chunk size和raid cache。一般raid cache用于读比较浪费,用于写缓冲可以提高IO速度。要使用写缓存的话,得确保raid有BBU,或者非易失存储器。写缓存可以提高性能至20倍。

对这些进行测试,可以在网上找到测试脚本。

network configuration   p 86

第五章

 

第六章

 

第七章

 

第八章

 

第九章

 

第十章

 

第十一章

 

第十二章

 

第十三章

 

 
posted @   szcj~  阅读(48)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示