高性能MySQL 第一章 mysql架构与历史

人盡茶涼 提交于 2020-03-18 10:44:43

mysql的存储引擎架构把查询处理及其他系统任务和数据的存储/提取相分离

1.1 mysql逻辑架构

  第一层:链接处理、授权认证、安全等大多数基于网络的工具或者服务都有类似的架构

  第二层:核心服务,查询解析、分析、优化、缓存、所有的内置函数(日期、时间等),所有跨存储引擎的功能,存储过程、触发器、视图等

  第三层:存储引擎,负责数据的存储和提取

  1.1.1 连接管理与安全性

    每个客户端连接都会在服务器进程中拥有一个线程,服务器会缓存线程,

  1.1.2 优化与执行

    mysql会解析查询,并创建解析书,然后优化。

    在查询之前,会先检查查询缓存

1.2 并发控制

  1.2.1 读写锁

    读锁和写锁

    1.2.2 锁颗粒

      表锁:

      行级锁:可以最大程度的支持并发,只在存储引擎层实现

1.3 事务

  原子性、一致性、隔离性、持久性

  1.3.1 隔离级别

    未提交读:事务的修改,即使没有提交,对其他事务也都是可见的。脏读

    提交读:一个事务只能看见已经提交的事务的修改。不可重复读

    可重复读:保证了同一个事务中多次读取同样记录的结果是一致的,mvcc,mysql默认隔离级别

    可串行化:强制事务串行执行

  1.3.2 死锁

    各种死锁检测和死锁超时机制,innodb目前处理死锁的方法是,将持有最少行级排他锁的事务回滚

  1.3.3 事务日志

    使用事务日志,存储引擎在修改表数据时只需要修改其内存拷贝,再把行为记录到持久在硬盘的事务日志中。事务日志是追加的方式,因此是顺序IO。

    事务日志持久后,内存中被修改的数据可以慢慢地刷回磁盘。预写式日志,修改数据需要写两次磁盘

  1.3.4 mysql中的事务

    默认采用自动提交,innodb采用两阶段锁定协议

1.4 多版本并发控制

  mvcc是行级锁的变种,很多情况下避免了加锁操作,是通过保存数据在某个时间点的快照来实现的,

  innodb的mvcc通过在每行记录后面保存两个隐藏的列,一个是行的创建时间,一个是行的删除时间,存储的并不是时间值,而是系统版本号。

  每开始一个新的事务,系统版本号就会递增,系统版本号会作为事务的版本号

    select:innodb会根据两个条件检查每行记录:

        a.只查找版本早于当前事务版本的数据行

        b.行的删除版本要么未定义,要么大于当前事务版本号

    insert:为新行保存当前系统版本号

    delete:为删除行保存当前系统版本号为行删除标识

    update:插入一行,保存当前系统版本号,同时保存当前系统版本号到原来的行作为行删除标识

1.5 存储引擎

  每个数据库保存为数据目录下的一个子目录,下面.frm文件保存表的定义,

     

    

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!