高性能mysql学习 1 架构

以前对于数据库的学习入门就是增删改查,然后慢慢的接触触发器、存储过程,视图,然后就觉得基本学完了,虽然知道mysql有相关的性能优化,不过没有在意,直到最近开始接触高性能mysql这本书,才知道自己知道的东西还是太少了,决定写博客留给自己看,主要是对mysql高性能的整理,自己复习使用,有兴趣的同学最好直接看原版书籍。

1. mysql逻辑架构

1.1.mysql服务器逻辑架构

下面就是一个简单的图形说明:在这里插入图片描述
最上层是客户端,这一层是不属于mysql的架构的,下面主要就是三层,分别为:

第一层:连接、线程处理,主要包括连接处理、授权认证‘安全,并非mysql独有。
第二层:查询缓存、解析器、优化器,mysql的核心服务功能都在这里,包括了查询解析、分析、优化、缓存以及所有的内置函数(如:日期、时间、数学和加密函数)。
第三层:存储引擎(并不是图中只有一个存储引擎),负责mysql中数据的存储和提取,不同引擎有各自的优缺点,常用的有InnoDB和MyISAM。

关于mysql逻辑架构还需要注意两个东西:连接管理与安全性优化与执行
连接管理与安全性

  1. 每个客户端连接在服务端进程都会有一个线程,这个连接的所有查询都在这个线程里面执行,而服务端只负责缓存线程,不需要为新连接创建和销毁线程。
  2. 客户端连接到mysql都需要认证,认证基于原始主机信息和密码。

安全与执行:

  1. mysql会解析查询,并创建内部数据结构(解析树),然后对其进行各种优化,包括重写查询、决定表的读取顺序,以及选择合适的索引等等。
  2. 优化器并不关心使用什么存储引擎,但是存储引擎对于优化查询是有影响的。

1.2 并发控制

无论何时,多个查询需要在同一时刻修改数据,都会产生并发控制的问题。并发产生的层面:服务器层,存储引擎层。
读写锁:为了最大化数据库事务并发能力,数据库中的锁设计为两种模式,分别是共享锁和排他锁,也叫读锁和写锁。

锁粒度:提高共享资源的并发性的方式就是让锁定对象更有选择性;尽量只锁定需要修改的部分数据,而不是所有数据。

锁策略:就是在锁的开销和数据的安全性之间寻找平衡,这种平衡当然也会影响到性能。

  1. 表锁:mysql中最基本的锁策略,并且是开销最小的策略,但是它会锁定整张表。
  2. 行级锁:可以支持最大的并发处理,同时也带来了最大的开销。

1.3 事务

事务是一组原子性的sql指令,或者是一个独立的工作单元。如果数据库引擎能成功地对数据库sql指令全部语句,要么全部执行成功,要是全部失败。主要用于处理操作量大,复杂度高的数据。

一个运行良好的事务处理系统,必须拥有的特性:ACID(原子性,一致性,隔离性,持久性)

mysql中的引擎并不是全部都支持事务。
隔离级别

Read Uncommitted(读取未提交):所有事务都可以看到其他未提交事务的执行结果。(读取未提交的数据称为脏读)
Read Committed(读取提交):一个事务只能看到已经提交的事务所做的改变。
Repeatable Read(可重复读):这是mysql默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。(可能出现幻读,可以使用间隙锁,InnoDB通过MVCC解决幻读)
Serializable(可串行化):这是最高隔离级别,他通过强制事务排序,使之不可能相互冲突,从而解决幻读,其实就是每个读上加一个共享锁。

死锁

两个或者两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,他们都将无法推进下去。

事务日志:分别为redo log和undo log两种,他们的主要职责时负责保证事务的ACID特性,同时提高提高事务的效率,并且突然断电也可以通过日志恢复数据。

自动提交:mysql中的事务默认是自动提交模式,如果关闭需要显示调用提交或者回滚才会开始一个新的事务。

混合引擎使用事务:这种做法是不可靠的,因为有些引擎是非事务型的,变更无法回滚,这回倒是数据库处于不一致的状态,很难修复,最终结果也很难确定。

隐式和显式锁定:InnoDB采用两阶段锁定协议,在事务执行过程中,随时都可以执行锁定,锁只有在执行commit或rollback的时候才会释放,并且所有的锁是在同一时刻被释放的,前面所述的锁定是隐式锁定,InnoDB会根据事务的隔离级别在需要的时候自动加锁。

lock tables 和事务之间相互影响的话,情况会变得负责,在某些mysql版本,甚至会产生无法预料的结果,因此,建议除了事务中禁用autocommit,可以使用lock tables之外,其他的任务时候都不要显式的执行lock tables,不管使用的什么存储引擎。

1.4 多版本并发控制

MVCC:多版本鬓发控制,提供并发访问数据库时,对事务内读取带的内存做处理,用来避免写操作堵塞读操作的并发问题。

MVCC提供了时间一致性的处理思路,在MVCC下读取事务时,通常使用一个时间戳或者事务id来确定访问哪个状态的数据库及哪个版本的数据。读事务和写事务彼此隔离开来的,彼此之间不会影响。(假设同一份数据,既有读事务访问,又有写事务操作,实际上写事务会新建一个新的数据版本,而读事务访问的是旧的数据版本,直到写事务提交,读事务才会访问到新的数据。)

MVCC有两种实现方法:

  1. 将数据记录的多个版本保存在数据库中,当这些不同版本数据不再需要时,垃圾收集器会回收这些记录。
  2. 只在数据库保存最新版本的数据,但是会在使用undo时动态重构旧版本的数据。(InnoDB使用的就是这种。)

InnoDB的MVCC的实现机制

MVCC可以认为是行级锁的变种,它可以在很多情况下避免加锁的操作,因此开销更低。
MVCC的实现大都实现了非阻塞的读操作,写操作也只锁定必要的行。
InnoDB的MVCC实现是通过保存数据在某个时间点的快照来实现的。一个事务,不管其执行多长时间,其内部看到的数据都是一致的。也就是事务在执行的过程中不会相互影响。

具体实现:InnoDB的MVCC,通过在每行记录后面保存两个隐藏的列来实现:一个保存了行的创建时间,一个保存行的过期时间,当然这里的时间并不是时间戳,而是系统版本号,没开始一个新得事务,系统版本号就是递增。

1.4 mysql存储引擎

     ~~~~     在mysql5之后,mysql支持的引擎其实很多了,我们可以使用show engines查看(可以加 \G),不同的存储引擎有各自的优缺点,只有合适的才是最好的。
     ~~~~     mysql的存储引擎负责数据的存储与提取。服务器中的查询执行通过api与存储引擎通信,通过接口屏蔽了不同存储引擎的差异。mysql采用插件式的存储引擎。
mysql存储引擎的特点:

  1. mysql采用插件式的存储引擎。
  2. 存储引擎是针对表的,而不是针对库的。
  3. 不管采用什么样的存储引擎,都会产生一个对应的frm文件。

常见的存储引擎:InnoDB,MyISAM。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值