CreateArtTechnology
/ Blog
Login
最新文章
Java
语言相关
库相关
虚拟机相关
CreateArtTechnology
项目搭建
使用的工具
自研的工具
开源工具
ELK
ElasticSearch
Jenkins
Markdown
GraphQL
Arthas
生产工具
Linux
Nginx
VersionControl
Subversion
Git
Redis
Archiva
Maven
Zookeeper
Spring
SpringBoot
MySql
HBase
Cassandra
容器化
Docker
Kubernetes
服务容器化从零开始
未分类笔记
算法相关
概念相关
豆知识
机器学习
机器学习从零开始
《高性能MySQL》笔记<1-MySQL架构与引擎>
15
2019-06-20 20:29:52
生产工具
MySql
## 架构 ![](/img/pic/2019062020293149827_png_583_418_76732) > MySQL架构图 MySQL的架构分为三层。 第一层只负责提供服务,包括链接处理、授权认证、安全等,做一些必要的检查、适配工作,类似Web应用的Controller层。 第二层包含了大多数MySQL的核心功能,包含查询解析、分析、优化、缓存等,以及一些跨存储引擎的功能,类似Web应用的Service层。 第三层包含多种存储引擎,每种引擎有自身的特性,但最终提供统一的底层API与上层通信,屏蔽了底层存储引擎的差异,类似Web应用的Dao层。 总体来说MySQL的架构与Web应用非常类似,高内聚低耦合。 ## 锁 MySQL的锁大致分为两种: - 读锁:共享锁 在没有写锁时允许同时有多个线程并发读取,读锁优先级低 - 写锁:排它锁 写锁阻塞其他的读锁与写锁,写锁优先级高 读写锁有优先级先后之分,猜测MySQL锁的机制与Java中ReentrantReadWriteLock(true)即公平版读写锁类似: - 加锁操作先排队 - 如果是读锁请求且排在队首,且当前没有写锁线程(排它锁未被其他线程占用),就可以加共享锁 - 如果是写锁请求在队首,当前共享锁未释放,就不可以加排它锁 - 写锁请求优先级高,可以插队 ## 多版本并发控制 MVCC 加锁毕竟是一个开销大的操作,使用MVCC可以尽量避免加锁,提高并发程度。 ### InnoDB的简化版MVCC行为 InnoDB的MVCC通过事务版本号控制来实现。 InnoDB每行数据有两个隐藏列:创建版本号和过期版本号。 系统有个版本号,会在每个事务开始时自增,事务版本号就使用此时的系统版本号,事务只允许查询小于等于自身版本号的数据行。 隔离级别在RR可重复读的情况下InnoDB的MVCC行为: **SELECT** 返回数据范围: 1. 创建版本小于等于本事务版本的 意味着是事务开始前或本事务创建的 2. 没有删除版本号,或者删除版本号大于本事务版本号 意味着未被删除,或是事务开始后删除的 **INSERT** 数据行使用当前事务版本号作为创建版本号 **仅仅这样会导致幻读,InnoDB使用间隙锁(next-key locking)来防止幻读** **DELETE** 数据行使用当前系统版本号作为过期版本号 **UPDATE** 1. 插入新行,创建版本为当前事务版本 2. 原来的行,过期版本修改为当前事务版本 ## 引擎 MySQL应用最广泛的引擎是InnoDB引擎,除此之外需要深入了解的引擎是MyISAM引擎,MyISAM与InnoDB应用场景有较大不同,且各有鲜明特点。 ### InnoDB引擎 MySQL默认引擎,可以说是万金油型,如果没有特别的理由或是不知道应该用什么引擎时,就**应该用InnoDB引擎**。 **InnoDB的特点** 1. 性能非常好 2. 支持事务 3. 使用MVCC支持高并发 4. 使用聚簇索引,主键查询性能高 5. 支持行锁 6. 支持热备份 7. 自动崩溃恢复 8. 很多自适应优化 9. 索引占用大 InnoDB性能高、支持事务、锁粒度小等因素使得其适合应用于各种需求,除非用到某些InnoDB不具备的特性且没有其他办法替代,否则应该**优先考虑使用InnoDB引擎**。 ### MyISAM引擎 MyISAM在某些方面可以被视为与InnoDB“异化竞争”的引擎,通常情况下如果不适合使用InnoDB引擎,应该考虑MyISAM引擎。 **MyISAM的特点** 1. 提供全文索引 2. 不支持事务 3. 不支持行锁,使用表锁 4. 支持并发插入,即其他线程对表加了读锁,也可以向其中插入记录 5. 占用空间小 6. 支持数据压缩 7. 支持写入缓存,批量刷盘 8. 支持地理空间函数,支持地理空间搜索 MyISAM相对于InnoDB引擎具有优势的部分在于数据占用空间小,插入速度快、开销低,可以压缩数据。 但是这些优势却牺牲了许多目前大多数应用场景中必不可少的点,也就是InnoDB那些特点,所以**应该优先考虑InnoDB**。 ## 参考资料 [第一章、MySQL架构及历史 - 简书](https://www.jianshu.com/p/1f17a496f14e)
发布文章 101
文章被阅读 1820
最近修改
什么是“丝滑”的曲线
2021-12-08 15:19:20
高效空间数据索引R树及其批量加载方法STR简介
2021-09-29 20:33:37
关于分库分表的一些事儿
2021-06-25 11:51:25
获得诺奖的稳定匹配理论之TTC算法与GS算法
2021-03-14 23:04:48
算法小白的机器学习入门实践,从零到上线
2021-01-13 14:28:27
分站宗旨
一站式资料平台,减少重复检索,减少重复采坑。