Mysql高性能学习笔记-01
刘岩
Blog:suhuanzheng7784877.iteye.com
1.Mysql的架构
Mysql整体的架构模块如下图所示
模块1:连接客户端,这个一般是指mysql基于mysql通讯协议的驱动程序。比如mysql的Java的JDBC驱动程序——mysql-connector-java-5.1.26-bin.jar。再比如.net平台的操作数据库的规范ADO。
模块2:连接池,Mysql自身有个连接池,为了连接线程的复用,Mysql将其进行了池化。将连接资源进行了池化,使得连接线程可以复用。(mysql 5.5以后)
模块3:SQL接口,接受SQL命令后,调用SQL接口,执行并返回相应的结果集。
模块4:SQL解析引擎,SQL语句需要进行解析。将SQL语句解析成为抽象语法树。从中也要识别SQL语句是否合法。
模块5:优化引擎,抽象成语法树后,就会对该命令进行一系列的对用户来说透明的优化措施——查询语句可能重新构造;目标表的读取顺序;
模块6:缓存以及缓冲引擎,对于select语句,解析sql语句之前。mysqld先检查查询缓存区域,如果能够在其中找到对应的查询,服务器不会继续解析,而是直接返回查询缓存的内容直接返回。
模块7:可插拔的存储引擎,常用的存储引擎:innodb、myisam、memroy。存储引擎可以根据业务需求,随意进行变更。
2.Mysql中的锁机制
表锁:
表锁是读写锁的一种实现,而mysqll的表锁是在服务层,也就是在存储引擎的上层,也是mysql最基本的锁策略。读锁之间不会相互阻塞,但是一旦遇到了写锁,所有其他的锁请求都会被阻塞住。而且写锁的执行优先级会高于读锁(双向队列可以实现非FIFO的场景)。
行锁:
行锁是存储引擎对于mysql基本锁策略的扩展,行锁定是存储引擎才具备的特性。最典型的行级锁存储引擎是innodb。而此时就又引出了innodb对于行锁的实现,也就是该引擎实现了MVCC——多版本并发控制。
在mysql的MVCC实现中,基本原则就是实现非阻塞的读取操作;写操作的时候仅仅锁定必要的目标行。
从MVCC的目标就可以基本猜出,它使用空间换取的时间。
简要概述:innodb的MVCC机制是在每个表每条记录的后面隐藏两个字段,第一个隐藏字段是该行的创建时间,第二个字段代表改行的删除时间。注意:这里的时间是指的系统版本号码。新的事务开启,该行版本号自动递增。事务开始的系统版本号需要和每行记录的版本号进行对比。在innodb中只有隔离级别是:repeatable read和read committed两个隔离级别才支持MVCC机制。
默认事务隔离级别——repeatable read对于CRUD的MVCC实现机制是
|
我们将查询操作事务和其他操作的事务进行一个简单的结合来进行分析,即:查询->插入、查询->删除、查询->更新。
查询->插入:首先说明,若是先进行插入事务(id为1),那么新增记录的创建字段为1,删除字段为NULL。后执行的查询事务(id为2),那么该条记录被查询事务作为有效记录返回给结果集,因为该记录的创建字段满足<=查询事务的id,而该条记录的删除字段又是空。
若是查询事务先执行,而插入事务后执行的话,那么。根据MVCC的规则,此新增的记录,并不会返回给结果集,因为查询事务的id要小于插入事务的id。
查询->删除:删除事务先于查询事务执行,那么删除事务的id将保存到该目标记录的删除字段上,而查询事务查询到此记录时,因为,该记录的删除事务小于查询事务,那么此信息不会被作为有效地结果返回给结果集。比较麻烦的是查询事务优于删除事务,先执行查询事务,而删除事务又很慢,还未改变该记录的删除字段的值,就执行了查询事务,那么查询事务会将此记录返回给结果集,因为该记录的删除字段的值小于该查询事务的id。那么返回到客户端后,客户端程序又想对此无效的记录做操作,而后续执行的删除事务,很给力,执行完毕后,该记录就是“幽灵记录”。那么此时应当在客户端程序中,对“幽灵记录”进行严密的防范措施——比如无效记录的异常信息提示等等。
查询->修改:这个结合了查询->新增、查询->删除这两个用例。当查询事务优于更新事务的时候,自不必说,查询出来的记录保持着原有的数据。当更新事务优于查询事务执行的时候,过程如下。更新事务将一条新的纪录插入到表中,将新纪录的创建字段赋值为自身事务id,并将自身事务id赋值给原记录,那么查询事务执行的时候,会查找低于自身事务id的记录,新增记录符合条件的,原始记录的删除字段的值小于查询事务自身的id,不会作为结果集记录返回的。
下图是每种操作事务类型对于那两个隐藏字段的关注点示意图。
3.Mysql的MyISAM与InnoDB的大致对比
因为后续还会对Mysql这两个重要的引擎继续讨论,那么咱们在这里先大致看一下这两个引擎的大致区别。后续更加细粒度化的区别,还是继续会讨论的。
相关推荐
【高性能MySQL笔记-总结】 MySQL作为一款广泛应用的关系型数据库管理系统,因其开源、免费且性能卓越的特性,在互联网行业中被广泛采用。本笔记旨在系统性地介绍MySQL的基础知识、性能优化及实战案例,帮助读者深入...
本资源"2020年mysql备课用的资料"包含了学习MySQL所需的关键元素,旨在帮助初学者掌握数据库管理和开发的基础知识。 首先,"mysql教程课堂用到的软件"可能包括MySQL Community Server,这是MySQL的核心组件,用于...
MySQL是一种广泛使用的开源关系型数据库管理系统,其高性能和可扩展性是其主要特点。本学习笔记将探讨MySQL的架构和锁机制,以帮助你更好地理解和优化数据库性能。 1. MySQL架构: MySQL的整体架构由多个模块组成...
这份“MYSQL学习资源及笔记-入门必备”压缩包文件显然包含了帮助初学者掌握MySQL基础知识的各种资料。下面,我们将深入探讨MySQL的一些核心概念和关键知识点。 1. **MySQL基础知识** - **数据库与表**:MySQL中的...
### MySQL核心技术学习笔记 #### 一、为什么要学习数据库 学习数据库的重要性主要体现在以下几个方面: 1. **持久化数据到本地**:数据库能够将应用程序产生的数据持久化存储在磁盘上,即使系统重启也不会丢失...
高性能Mysql中的第二章-基准测试和第三章-服务器性能剖析是需要全局考虑的问题,不同的应用场景,基准测试的方式和输入数据是不太一样的。所以我们后续再讨论这两个问题,先放过去,直接进行优化schema和数据类型...
### 高性能MySQL学习笔记:查询性能优化与实践 #### 一、查询性能低下的原因与分析步骤 查询性能低下通常归因于访问了过多的数据。优化查询性能的关键在于识别并减少不必要的数据访问。具体可以通过以下两个步骤...
MySQL高性能学习笔记主要关注如何通过优化数据库设计提升性能。以下是基于笔记内容的详细知识点解析: 1. **优化数据类型** 数据类型的选择对数据库性能至关重要,因为它直接影响存储空间、查询效率以及索引效能。...
- **Dedicated Server Machine**: 占用全部资源,适合高性能数据库服务。 #### 启动与登录MySQL - **服务管理**: 在Windows平台上,可以通过控制面板的“服务”管理MySQL服务的状态。 - **客户端工具**: 常见的...
读书笔记:高性能MySQL version 3 学习笔记
MySQL OCP 超详细学习笔记$pdf MySQL OCP 超详细学习笔记.pdf 是一份详细的 MySQL 学习笔记,旨在帮助 MySQL DBA master 数据库管理的知识和技能。本笔记涵盖了 MySQL 的多个方面,包括 MySQL 的配置、性能优化、...
高性能MySQL学习笔记.cpt
MySQL是一个开源、高性能、易于使用的数据库系统。它有社区版(免费)和企业版(收费)。在Windows上安装MySQL可以选择不同的版本,然后通过服务管理工具或命令行来启动和停止MySQL服务。用户可以通过MySQL自带的...
读书笔记:高性能mysql学习笔记
这份"886164823919662MySQL课堂笔记-day01"的资料很可能是初学者入门MySQL的学习资源,涵盖了第一天学习的重要概念和基础操作。下面,我们将深入探讨MySQL的一些关键知识点。 首先,我们从基础开始。MySQL是一种...
在优化数据库性能时,应该根据查询模式和数据分布来选择合适的索引策略,同时注意索引会占用额外的存储空间,并可能影响插入、更新和删除操作的性能。 总之,理解并熟练运用MySQL中的各种索引类型,以及何时创建...
《高性能MySQL Version 3 学习笔记》涵盖了MySQL数据库系统在优化、管理和高效利用方面的核心概念和技术。这个压缩包中的笔记可能包括了多个章节,详细阐述了如何提升MySQL的性能,确保系统的稳定性和可扩展性。尽管...
【尚硅谷周阳Mysql高级思维导图脑图学习笔记】是针对MySQL数据库系统的一份高级学习资料,包含了丰富的知识体系,旨在帮助学习者深入理解并掌握MySQL的高级特性和优化技巧。这份资源以.mmap格式提供,这是一种专业的...
本篇学习笔记将深入探讨如何通过索引优化、查询优化以及缓存利用等多种技术手段来提升MySQL数据库的性能,并介绍数据库的扩展策略(包括垂直扩展和水平扩展)以支持更高的并发量和更大的数据规模。 #### 性能优化 ...