《高性能MySQL》 MySQL 架构与历史

MySQL 逻辑架构

image-20190113152354118

  • 第一层:连接处理、授权认证、安全等
  • 第二层:存储过程、触发器、视图
  • 第三层:存储引擎(插拔式架构

并发控制

  1. 读写锁
    • 共享锁
    • 排他锁
  2. 锁粒度
    • 锁策略:在锁的开销和数据的安全性之间寻求平衡
    • 表锁(MySQL服务层实现
    • 行锁(存储引擎层实现

事务

  1. ACID

    • 原子性(atomicity
    • 一致性(consistency
    • 隔离性(isolation
    • 持久性(durability
  2. 隔离级别

    • READ UNCOMMITTED(读未提交

    • READ COMMITTED(读已提交

    • REPEATBLE READ(可重复读

    • SERIALIZABLE(串休化

      image-20190113153745313

  3. 死锁

    • 产生:两个或者多个事务在同一资源上互相占用,并请求锁定对方占用的资源,从而导致恶性循环的现象
    • 解决:死锁检测 死锁超时机制(InnoDB是将持有最少行级排他锁的事务进行回滚
  4. 事务日志

    • 预写式日志:修改数据需要写两次磁盘
  5. MySQL中的事务

    • 自动提交(默认
    • 两阶段锁定协议:事务执行过程中,随时都可以执行锁定,锁只有在执行COMMIT或者ROLLBACK的时候才会释放,并且所有的锁是在同一时刻被释放
    • 隐式锁定 / 显示锁定

多版本并发控制

  1. MVCC
    • 避免加锁操作,开销更低,提升并发性能
    • 通过保存数据在某个时间点的快照来实现
  2. InnoDB - MVCC
    • 每行记录后增加两个隐藏的列(行的创建时间,行的过期或删除时间
    • 时间依据系统版本号,开启新事务,系统版本号自动递增
    • 事务开始时刻的系统版本号作为事务的版本号,用于与查询到的每行记录的版本号进行比较
    • 只在隔离级别 RR 与 RC 下工作,RC 总是读取最新的数据行,SERIALIZABLE 加锁所有读取的行
    • 增删改查 示例
      • SELECT:符合以下条件才返回查询结果
        • 只查早于当前事务版本的数据行(行的系统版本号小于等于事务的系统版本号
        • 行的删除版本要么未定义,要么大于当前事务版本号
      • INSERT:新插入的每一行保存当前系统版本号作为行版本号(创建标识
      • DELETE:删除的每一行保存当前系统版本号作为 删除标识
      • UPDATE:INSERT + DELETE
        • 插入一条新记录,保存当前系统版本号作为行版本号
        • 将当前系统版本号作为原来行的删除标识

MySQL 的存储引擎

  1. SHOW TABLE STATUS
    • Rows:表中的行数,对于MyISAM等其他存储引擎,该值是精确的,对于InnoDB,该值时估计值
  2. InnoDB存储引擎
    • 默认事务型引擎
    • 处理大量的短期事务(大部分情况正常提交,很少会被回滚
    • 自动崩溃恢复
    • 采用MVCC来支持高并发,实现四个标准隔离级别
      • RR + next-key locking 策略防止幻读的出现
    • 聚簇索引、非主键索引
    • 优化:可预测性预读、自适应哈希索引、缓冲区等
    • 官方手册:15.2.10 . InnoDB事务模型和锁定
  3. MyISAM存储引擎
    • 全文索引、压缩、空间函数
    • 不支持事务和行级锁
    • 崩溃后无法安全恢复

读后哔哔

这一章主要是入门级别的MySQL总体阐述,关于其中的并发控制、事务、InnoDB存储引擎可以搭配着《MySQL技术内幕 InnoDB存储引擎》的第二章、第六章、第七章一起来看,《高性能MySQL》 这本书后续也没有再详细的介绍以上这几个点啦。

发布了98 篇原创文章 · 获赞 197 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/YangDongChuan1995/article/details/86425199