zoukankan      html  css  js  c++  java
  • mysql架构学习

    1.MySQL的逻辑结构:

     
    image.png

    1.第一层:对客户端的连接处理、安全认证、授权等,每个客户端连接都会在服务端拥有一个线程,每个连接发起的查询都会在对应的单独线程中执行。

    2.第二层:MySQL的核心服务功能层,包括查询解析、分析、查询缓存、内置函数、存储过程、触发器、视图等,select操作会先检查是否命中查询缓存,命中则直接返回缓存数据,否则解析查询并创建对应的解析树。

    3.第三层:存储引擎,负责数据的存储和提取,MySQL服务器通过API与存储引擎通信,屏蔽了各种引擎之间的差异,常见的存储引擎有:InnoDB、MyISAM,两者的详细介绍以后会继续深入分析。

    2.MySQL中的锁:

    MySQL在处理并发读写的时候,分别使用共享锁(读锁)和排它锁(写锁)对共享资源高并发操作,在加锁的时候,最好能锁定所需数据,控制锁的粒度、提高并发能力,MySQL提供了两种重要的锁策略:

    • 标记锁:锁定整张表,在对表进行插入更新删除操作时,需要先获得写锁,锁定整张表,其他读写操作都会被阻塞。读锁之间不会阻塞。

    • 行级锁:锁定数据所在行,行级锁只在存储引擎层实现,可以很好支持并发处理。

    3.MySQL的事务:

    • 事务的实现原理:MySQL中的事务是在存储引擎中实现的,所以上层的服务是不会管理事务的。默认情况下,MySQL自身提供了两种事务型的存储引擎,分别是InnnoDB和NDB Cluster。
      在默认情况下,MySQL事务采用自动提交模式,即如果没有显示的开启一个事务,那么每一次的查询都将被当做一个事务执行自动提交。当然,也可以通过设置来改变这种自动提交的模式。如果想开启自动提交,可以通过命令SET AUTOCOMMIT = 1或SET AUTOCOMMIT =ON来设置;关闭自动提交模式,可以通过命令SET AUTOCOMMIT = 0或SET AUTOCOMMIT = OFF来设置。
      InnoDB存储引擎采用的是两阶段锁定协议,在事务执行的过程中,InnoDB会根据隔离级别在需要加锁的时候自定加锁,锁只有在事务提交或回滚的时候才会释放。当然,也可以显示的加锁,如使用SELECT FOR UPDATE,也可以使用服务层实现的LOCK TABLES和UNLOCK TABLES。

    • 事务日志:即一种特殊的操作记录日志,存储引擎在修改表数据的时候,只修改内存中的拷贝,然后将修改行为记录保存到硬盘上的事务日志中,对事务日志的保存操作采用追加的方式,保存操作是顺序IO,相对于存储引擎直接将数据持久化到硬盘的随机IO高效的多。事务日志保存后,内存中被修改的数据在后台可以慢慢的持久化到硬盘。如果事务日志保存成功了,而内存中被修改的数据没有成功的写入硬盘,发生了系统崩溃,存储引擎会在重启时自动恢复这部分数据。

    • 事务的特性:ACID

    • 原子性:一个事务的所有操作要么全部执行要么全部失败回滚

    • 一致性:事务执行结果使数据库从一个一致性状态变成另一个一致性状态

    • 隔离性:事务操作提交之前,操作结果对其他事务不可见

    • 持久性:事务提交后,所有的修改操作会永久保存到数据库中

    • 事务的隔离级别:SQL标准定义了四种隔离级别,分别是read uncommitter,read committed,repeatable read,serializable,可以通过set transaction isolation level命令来设置隔离级别


       
      image.png

    脏读:事务未提交的数据能被其他事务读到
    不可重复读:一个事务前后两次读取某数据中间时刻,有事务修改了数据,导致两次读取的数据不一致
    幻读:事务在读取某范围内数据,其他事务在范围内插入了新记录,导致事务内两次读取的数据会不一致

    • 隔离级别的实现原理:

    • 未提交读:读数据的时候不加锁,写数据的时候加行级别的共享锁,提交时释放锁。行级别的共享锁不会对读产生影响,但可以防止连个同时的写操作

    • 已提交读:事务读取数据时(读到数据的时候)加行级共享锁锁,读完释放锁;事务写数据的时候(写操作发生瞬间),加行级独占锁,读完后立即释放锁。由于事务写操作加独占锁,因此事务写操作时,读操作也不能进行,因此不能读到事务的未提交数据,避免了脏读的问题,但由于读操作的锁加在读上面(锁的粒度较小),而不是事务之上,所以在同一事务的两次读操作之间可以插入其他事务的写操作,所以可能发生不可重复读的问题

    • 可重复读:与已提交读不同的是,事务读取数据在读操作开始瞬间就加上了行级锁共享锁,而且在事务结束的时候才释放(锁的粒度与已提交锁不一样),锁加在事务上,解决了不可重读问题,事务写操作加独占锁,同上,但是由于加的是行级锁,所以会出现幻读问题

    • 可串行化:在读操作时,加表级共享锁,事务结束时释放,写操作时,加表级独占锁,事务结束时释放。该隔离级别下可能会导致大量的超时和锁竞争问题。

    4.MySQL中的死锁:

    指多个事务在同一资源上相互占用,并请求锁定对方所占用的资源,从而导致的恶性循环条件,数据库系统为解决这个问题实现了死锁检测和死锁超时机制,在MySQL的InnoDB存储引擎中,解决死锁的方法是将持有最少行级排它锁的事务进行回滚。

    5.多版本并发控制MVCC:

    基于对并发性能的考虑,MySQL的大多数事务型存储引擎都实现了多版本并发控制,可以简单的认为MVCC是行级锁的一个变种,但是它在很多情况下避免了加锁操作,降低了开销。

    InnoDB的MVCC是通过在每行记录后添加两个隐藏列来实现的,一个列用于保存行的创建时间,一个列用于保存行的过期时间,这两个时间在实际存储的时候,存储的是系统版本号。每开始一个新事务,系统版本号都将递增。需要注意的是MVCC只能在Read Committed和Repeatable Read隔离级别下正常工作。

    6.MySQL存储引擎:

    MySQL自身和第三方提供了多种存储引擎,每种存储引擎优势各不相同,可以根据实际业务需要来选择对应的存储引擎。

    • InnoDB是MySQL的默认事务型存储引擎,主要用来处理大量的短期型事务。它采用MVCC来支持高并发,默认的事务隔离级别是Repeatable Read,并通过间隙锁策略防止幻读的出现。InnoDB表是基于聚簇索引建立的,而聚簇索引可以提高对主键查询的性能,但是它的二级索引(非主键索引)中必须包含主键,如果主键列很大,并且有很多个二级索引,那么这些索引将会占用很大的空间和资源,所以在创建主键的时候尽量的小。

    • 在MySQL5.1及之前的版本中,MyISAM是默认的存储引擎,它提供了全文索引、压缩、空间函数等功能,但是它不支持事务和行级锁,并且崩溃后无法安全恢复,而InnoDB引擎是可以自动崩溃恢复的。MyISAM在并发的情况下,对整张表加锁,读操作会对需要读的所有表加共享锁,写入时对表加排它锁

  • 相关阅读:
    很不错的WebCart控件,分享给大家
    Atitit 功能扩展法细则条例 目录 1. 界面ui扩展 2 1.1. 使用h5做界面 2 1.2. 自制h5 ide。。简化ui自定义配置 2 2. 业务逻辑扩展 2 2.1. Bpm流程引擎还
    Atitit 持久化与数据存储标准化规范 目录 1. 存储的附加功能 2 1.1. 基本存取功能 2 1.2. 全文检索(imap 2 1.3. 属性检索 2 1.4. 查询语言 2 2. 基于内容
    Atitit 常见硬件集成列表 目录 1.1. 小程序设备类 1 1.2. atitit.常见手机的传感器与外设 attilax总结 1 1.3. Pc机外设 1 1.4. 设备管理器 2 1.1
    Atitit 项目wechat微信截屏生成vcf通讯录384 个 384个人 42个节拍,平均每个8个人 技术点 im图像裁剪, ocr Tesseract Vcf格式 /wechatTel
    atitit 音频 项目 系列功能表 音乐 v3 t67.docx Atitit 音频 项目 系列功能表 音频 音乐 语言领域的功能表 听歌识曲功能 酷我功能。 铃声 功能。。 音频切割(按照副歌部
    Atitit spring springboot 集成mybatis法 目录 1.1. 使用spring管理数据源。。需要修改spring、 配置 1 1.2. 直接代码集成,无需修改任何配置 1
    Atitit 艾提拉音频资源列表与统计 t6 六月份战果与7月份规划.docx 目录 1. 第一层次 原始资源类 采集资源类 1 1.1. K歌类采集资源 整理 1 1.2. K歌类资源初步分类
    Atitit 长距离无线通信法 LoRa NBIoT NBCIoT LoRa是Semtech公司的创新发明,该技术向用户提供显著的长距离、低功耗、安全数据传输机制。使用LoRa技术构建的公用网
    Atitit 读取音频音乐文件的bpm 目录 1.1. Librosa是一个用于音频、音乐分析、处理的python工具包, 1 1.2. \bpm.py 1 1.3. Echo 2 1.4. Cod
  • 原文地址:https://www.cnblogs.com/yangqiong1989/p/10745244.html
Copyright © 2011-2022 走看看