一眼mysql之一:架构

mysql架构

逻辑架构

  • 第一层大部分是连接处理,授权认证,安全等
  • 第二层则是核心服务:查询解析,分析,优化,缓存和所有内置函数,所有跨存储引擎的功能都在这一层:存过过程,触发器,视图等
  • 第三层包含了存储引擎,不同存储引擎之间不会相互通信,简单的响应上层服务器的请求而已

连接管理和安全性

  • 简单的在服务器进程里面拥有一个线程,连接查询只会在这个单独的线程里面执行,不需要为每个新建的连接创建或销毁线程(连接池),
  • 安全则是服务器进行认证,

优化和执行

  • 解析查询,然后创建解析树,接着进行各种优化,包括重写查询,决定表的读取顺序,和选择合适的索引等,可以通过特殊的关键字提示优化器,影响决策过程,
  • 优化器不关心使用的是某种引擎,但是引擎对查询是有影响的,所以在建表时就可以选择引擎
  • 在解析查询之前,会先检查查询缓存,如果能命中,服务器就不执行了具体的查询过程了

并发控制

  • 首先是两个层面的并发控制:服务器层和存储引擎层
  • 读写锁:共享锁和排它锁,也可以说是写锁和读锁
    • 读锁共享,相互不堵塞,
    • 写锁排他,只有一个用户能同时执行写入,并防止他人写入同一资源

锁粒度

锁的粒度可以理解为锁所要锁住的东西的大小,大的用大锁,小的用小锁,锁之间也存在各种操作,带来的是系统的开销,所以锁也不是越大越好也不是越多越好,合适即可

  • 首先是表锁,也就是锁住整张表,然后基本使用是在备份的时候锁住整张表来做备份
  • 行级锁:可以最大程度的支持并发处理,最明显的引擎为innodb和xtradb

事务

  • 事务的概念:ACID

    • 一致性,持久性,原子性,隔离性
  • 事务的好处:最主要的是保证数据的一致性

  • 隔离级别

    • READ UNCOMMITTED(未提交读):不同事务里面,可以读到别人还没提交的事务里面的值,造成的 结果是脏读
    • READ COMMITTED(提交读/不可重复读):就是在我这个事务里面只有我事务结束了,你才能读到我这个修改的内容,造成的结果是,可能相同事务里面两个读操作读到的数据不一致
    • REPEATABLE READ(可重复读):也就是说我在本次事务里面,相同的读操作是不会改变的(除非自己做出修改),造成的结果是幻读,也就是相邻两次读不一致(mvcc解决)
    • SERIALIZABLE(可串行化):通过强制事务串行执行,每次读的数据上面都加锁,只有接受没有并发和非常确保数据一致性的情况下采用
  • 死锁:两个或多个事务在同一资源上相互占用,请求锁定对方占有的资源,恶性循环的现象

  • 解决方案:部分或完全回滚其中一个事务,重新执行因死锁回滚的事务即可

  • 事务日志:在一个小区域内顺序io,如果是改写操作,就会写两次,一次写日志(内存),一次写磁盘,两段式提交

  • mvcc:保存数据在某个时间点的快照来实现的,(可以理解成每个事务都有自己专门的一张表,不会变的)

  • innodb的mvcc实现:通过在每行记录后面保存两个隐藏的列来实现,两个列,一个保存了行的创建时间,一个保存行的过期时间,存的是版本号,每开始一个新的事务,版本号会自动递增,事务开始时间的系统版本号就是事务的版本号,用来和查询得到的每行记录的版本号进行比较,

mysql的存储引擎

  • 1:innodb存储引擎:是默认事务型引擎,擅长处理大量短期事务,采用mvcc支持高并发,默认隔离级别是可重复的,通过间隙锁策略防止欢度的出现,

    • 间隙锁 : 不仅仅锁定查询设计的行,还会对索引中的间隙进行锁定,防止幻影行的插入
    • 基于聚簇索引建立的,但是二级索引比较包含主键
  • 2 myisam存储引擎

    • 不支持事务和行级锁,但是支持全文索引,压缩,空间函数等,缺陷是崩溃后无法安全恢复,对于只读或者表比较小,可以忍受修复操作,可以使用
    • 存储:将数据文件和索引文件分成.MYD和.MYI为扩展名的两个文件内,默认只能处理256t数据
  • 3:如何选择合适的引擎

    • 1:需要事务支持,Innodb或xtraDB是最好的,如果不需要事务,而且主要是select和insert操作,使用myisam
    • 2备份:如果需要在线热备份选择innodb
    • 3:崩溃恢复:选择innodb而不是myisam
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值