高性能mysql阅读笔记(一)mysql的架构与历史

高性能mysql阅读笔记(一)mysql架构与历史

前言

对于mysql的学习,博主一直局限于本科课堂的数据库知识,然后就是零零碎碎的阅读一些书籍的部分章节,没有系统的学习过,所以在这里再挖个坑,之后会陆陆续续的把这本高性能mysql读完,笔记为证。

mysql的逻辑架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DxqfDQfJ-1618146150944)(uploads/image-20210410224823785.png)]

如上图所示,mysql的逻辑结构分为三部分,其中

第一部分和C/S架构一样,负责连接的处理,安全认证等

第二部分是mysql的核心功能,负责对查询的解析、分析、优化及缓存,所有的内置函数也在这一层实现

第三部分包含存储引擎,单纯负责数据的存储和提取

并发控制

在并发控制中,锁是一种有效的机制来保证数据的安全,但同时也会造成效率的低下。

而提高性能的办法就是让锁粒度最小化的同时也要减少锁的资源消耗,在MySQL中,提供了两种重要的锁策略:

  1. 表锁

表锁会在进行写操作时将整张表锁定,优点是开销较小但不够灵活,在存储引擎和mysql服务器都可以实现表锁

  1. 行级锁

行级锁只在存储引擎实现,可以最大程度的支持并发处理,目前InnoDB和XtraDB实现了行级锁

事务

事务的特性与隔离级别

事务就是一组独立的工作单位,这个工作单位由一组sql构成,需要满足ACID4大特性,这里就不赘叙了

ACID四大特性通常难以完成,就算完成了也需要付出极大的代价,所以一般的方法都是做出妥协。

对于隔离性,要实现最严格的隔离性就要使得所有的事务串行执行,这明显会极大的降低性能

所以定义了四种隔离级别:

read uncommit(未提交读)

在这种隔离级别下事务即使没有提交也会对其他事务可见,所以其他事务会读到可能提交失败的数据,这就是脏读。

read commit(已提交读)

在这种隔离级别下一个事务只能读取已经提交事务的数据,但是在本事务中的两次查询可能会读到不一样的数据(在读取之间别的事物提交了)。

已提交读是大多数数据库默认的隔离级别(mysql不是)

repeatable read(可重复读)

可重复读解决了上述问题,该级别保证了同一事务多次读取结果一致,但无法解决幻读的问题(范围读取时,其他事务可能进行了插入)

InnoDB和XtraDB存储引擎通过多版本并发控制解决了幻读的问题,在后面会进行讨论。

serializable(串行化)

串行化通过强制事务串行执行来保证事务间的强一致性

死锁

死锁是并发中的常见问题,数据库系统中提供了各种死锁检测的机制来检测到死锁的循环依赖,检测到死锁后,InnoDB的做法是将持有最少行级排他锁的事务进行回滚。

事务日志

如果我们每一次修改数据都要刷新到磁盘,那效率必然会十分低下,使用十五入职,存储引擎在修改表时只需要修改内存,然后将修改行为记录到事务日志中,之后再在后台慢慢刷回到磁盘。

多版本并发控制

简单的行级锁无法保证可重复读,而更大粒度的锁又会造成并发度低,所以通常需要通过多版本并发控制来实现无锁。

MVCC的实现机制不尽相同,这就导致了我们在看不同的博客时看的一头雾水。。。

我们这里描述一下InnoDB的简化行为:

InnoDB的MVCC是通过在每行记录后面保存两个隐藏的列来实现的,这两个列一个保存了行的创建时间,一个保存了行的过期时间。(这里的时间指的是版本号,每个事务开启会递增)

每个事务在开始时刻都会将系统版本号作为事务的版本号,在可重复读级别下:

执行select时,事务只会查找创建版本号低于该事务号且删除版本号(若存在)高于事务号的数据行,这样可以保证该记录时事务开始前就存在的,且没有被删除。

执行insert时,将该事务号作为创建版本号。

执行delete时,将事务号作为删除版本号。

update操作就是delete+insert。

mysql的存储引擎

InnoDB存储引擎

InnoDB是mysql的默认事务型引擎,他被设计用来处理大量的短期事务。其默认隔离级别是可重复读,并通过间隙锁防止了幻读。InnoDB的表是基于聚集索引建立的,并且支持建立非主键索引。

InnoDB内部做了很多优化来提高读取和插入性能,在后面会详细介绍。

MyISAM

myisam不支持事务和行锁,所以在崩溃后无法安全恢复,且不支持外键。但myisam也不是一无是处,myisam支持全文索引,且允许没有主键和索引的表存在。

myisam的索引和innodb的不同之处在于,myisam的主键索引和非主键索引一样,都是存放数据的指针,而innoDB的主键索引会存储整行的数据。

CSV引擎

csv引擎支持将普通的csv文件作为mysql表来处理,这样就可以将其他格式的数据(excel)转换为csv文件,然后就能在mysql中使用。作为一种交换机制,csv也非常有用。

XtraDB存储引擎

traDB存储引擎是基于InnoDB引擎的一个改进版本,已经包含在Percona Server和MariaDB中,它的改进点主要集中在性能、可测量性和操作灵活性方面。XtraDB可以作为InnoDB的一个完全的替代产品,甚至可以兼容地读写InnoDB的数据文件,并支持InnoDB的所有查询。

a Server和MariaDB中,它的改进点主要集中在性能、可测量性和操作灵活性方面。XtraDB可以作为InnoDB的一个完全的替代产品,甚至可以兼容地读写InnoDB的数据文件,并支持InnoDB的所有查询。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值