高性能Mysql——Mysql架构与历史

###MySQL逻辑架构sql

输入图片说明

###并发控制服务器

  • 服务器层 :表级锁架构

  • 存储引擎层:行级锁只有存储引擎层(InnoDB、XtraDB)实现并发

共享锁(Shared lock) 排他锁(exclusive lock) 或 读锁(read lock) 写锁(write lock)atom

####锁粒度日志

  • 表级锁( lock tables) Read Local
  • 行即锁 (select lock in share mode、 select for update)

###事物 ####ACIDcode

  • 原子性(atomicity)
  • 一致性(consistency)
  • 隔离型(isolation)
  • 持久性(durability)

####隔离级别blog

  • READ UNCOMMIT(未提交读):形成脏读
  • READ COMMIT(提交读):形成不可重复读
  • REPEATABLE READ(可重复读):还有幻读(Innodb和Xtradb经过MVCC解决)
  • SERIALIZABLE(可串行读):强制事物串行执行

输入图片说明

####死锁 定义:两个或者多个事物在统一资源上相互占用,并请求锁定对方占用的自娱啊,从而致使恶性循环的现象图片

解决方案:事务

  • 死锁检测
  • 死锁超时机制 Innodb处理方式:将持有最少行级排他锁的事物进行回滚

####事物日志:提升事物效率 预写式日志(Write-Ahead Logging):修改数据时指修改内存拷贝,修改行为记录到持久在硬盘上的事物日志中,持久化之后再慢慢刷回到磁盘

ps:顺序I/O、随机I/O

####Mysql的事物 事务型的存储引擎:

  • InnoDB
  • NDB Cluster

自动提交AUTOCOMMIT

启用:每个查询都被看成一个事物执行提交操做
不启用:全部查询都放到一个事物中,直到COMMIT/ROLLBACK
DDL语句会强制执行COMMIT,好比 ALTER TABLE等语句
设置事物隔离级别:SET TRANSACTION IOSOLATION来设置事物隔离级别
ps:同一个事物中,使用多种存储引擎时不可靠的,可能会形成非事务型表上的变动没法回滚形成数据处于不一致的状态

####多版本并发控制(MVCC,Multiversion Concurrency Control) 能够认为MVCC是行级锁的变种,可是它在不少状况下避免了加锁操做,所以开销更低,实现来非阻塞的读,写操做也只锁定必要的行

实现方式:保存数据在某个时间点的快照

  • 乐观并发控制
  • 悲观并发控制

InnoDB实现

每行增长两个隐藏的列实现:建立时间/过去时间<<<系统版本号
事务开始时刻的系统版本号会做为事务的版本号
REPEATABLE READ(可重复读)隔离级别下,MVCC实现
SELECT:
    -   行的版本号<=事物版本号:数据要么在事务开始前已经存在,要么是在事务自身插入或者修改过的
    -  行的删除版本要么未定义,要么>事务版本号,确保事务读取到的行,在事务开始以前未被删除

INSERT:
    保存当前系统版本号为行版本号
DELETE:
    保存当前系统版本号为行删除标识
UPDATE:
    InnoDB为插入一行新纪录,保存当前系统版本号为行版本号,同时保存当前系统版本号到原来的行做为行删除标识

PS:MVCC只在REPEATABLE READ和READ COMMIT隔离级别下工做

相关文章
相关标签/搜索