/* * -------------------------------------------------------- * 高性能MySQL-3rd-Baron Schwartz-笔记 * 第一章 MySQL架构与历史 */ --------------------------------------------------------
1.1 MySQL逻辑架构
第一层基本,连接处理、授权认证、安全等;
第二层特色:MySQL的核心,解析、分析、优化、缓存、内置函数(日期、时间、数学和加密函数)、跨存储引擎的功能(存储过程、触发器、视图);
第三层:存储引擎。负责数据的存储与提取,用户通过API(几十个底层函数)实现“开始一个事务”或者“根据主键提取一行记录”。注意:不同存储引擎之间不会通讯,只简单响应上层服务器的请求。
1.2 并发控制
当有多个查询需要在同一时刻读取或修改数据(表、行)就会需要并发控制;通常使用”锁系统“,读锁(共享锁)、写锁(排他锁);
锁粒度:解决的是锁定对象的选择性问题,而不是锁定一定范围内所有资源,这是实现高并发的有效方式;
MySQL提供多种存储引擎,不同存储引擎实现自己的锁策略和锁粒度,相互结合,效果明显;如有的表使用InnoDB(热数据-更新速度),有的表使用MyISAM(冷数据-查询速度)。
1.3 事务
事务:就是一句查询或一组查询,且满足原子性,要么全部执行,要么全部失败;如一句select查询中,如果存在语法错误,MySQL直接返回错误,不会执行;又如在“start transaction ... commit”一组查询中,如果存在一条语句崩溃或其他原因无法执行,那么这组查询中所有语句都不会执行,或者说部分执行的结果不会真正commit。
事务,必须满足ACID,原子性(Atomicity)、一致性(consistency)、隔离性(isolation)、持久性(durability),事务的ACID特性可以确保银行不会弄丢你的钱,实例图(从支票账户去200元到储蓄账户)
事务,涉及SQL通用的“隔离级别”概念(四级),还涉及“死锁”(两个事务互相锁定、互相等待对方释放、死循环),还涉及“事务日志”;事务日志,数据修改的日志,数据库启动后,将日志载入内存,SQL查询修改数据时,先将修改行为计入内存中的日志(顺序I/O方式),等内存中的日志保存在硬盘后,再慢慢刷回数据库存储磁盘(随机I/O方式),所以事务日志方式速度快,RAM化。
事务,使用时最好不要一次性执行涉及InnoDB表和MyISAM表的操作,因为如果失败,InnoDB表可以回滚,MyISAM表则做不到。注:InnoDB存储引擎为事务型,MyISAM存储引擎为非事务型。
MySQL默认采用自动提交(AUTOCOMMIT)模式,使用 SHOW VARIABLES LIKE 'AUTOCOMMIT' 查看结果为 ON 或 1。自动提交模式中,每个查询都被当作一个事务执行提交操作;当然只对 InnoDB存储引擎有效,对MyISAM无所谓。总结:确定好冷热数据,选择好存储引擎类型,其他保持MySQL默认设置。
1.4 多版本并发控制(MVCC)
MVCC貌似很神秘,其实很简单,当然采用这个办法并提高并发效率的MySQL是伟大的:-)多版本就是给数据表再增加两个隐藏的列,一列表示创建时间,一列表示删除时间,当然存储的不是时间值,是以系统版本号替代;注意:默认每执行一次查询操作,系统版本号+1递增;通过判断这两列取值可以保证大多数读操作不用加锁(行级锁),使读数据更简单,性能也很好。
1.5 MySQL的存储引擎
首先试用 SHOW TABLE STATUS LIKE '表名',查看表的名称、使用的存储引擎类型、行数、行格式(Row_format)等信息。
InnoDB存储引擎,事务型,用来处理大量的短期(short-lived)事务,采用MVCC支持高并发,默认使用REPEATABLE READ(可重复读)隔离级别,可防止幻影行插入,基于聚簇索引建立,支持热备份;热备份就是可以不用停止读或写就可以获得一致性视图。
MyISAM存储引擎,非事务型,不支持事务和行级锁,采用表级锁,奔溃后无法安全恢复;支持基于分词创建的全文索引;其表级锁表现为:读取时加共享锁,写入时加排他锁,但读取时也可以插入新记录;MyISAM引擎设计简单,数据以紧密格式存储,某些场景性能很好。但根本问题是表级锁问题,使查询处于Locked状态。
其他存储引擎,还有很多...
如何选择?大部分情况下,InnoDB都是正确的选择、第一选择、优先选择!如果不在乎扩展能力、并发能力,也不在乎奔溃后数据丢失问题,对空间占用比较敏感,那么选择MyISAM。
如何选择?除非万不得已,否则建议不要混合使用多种存储引擎,否则可能带来一系列问题、潜在Bug、边界问题。
如何选择?考虑因素:事务、备份、崩溃恢复、特有的特性;
如何选择?事务指,需要事务支持,肯定是InnoDB;如果主要是SELECT和INSERT,那使用MyISAM;
如何选择?备份指,备份方式,如果需要热备份,肯定InnoDB;
如何选择?崩溃恢复,数据量比较大时,系统崩溃后如何快速恢复是个大问题;MyISAM崩溃损坏的概率比InnoDB高很多,而且速度慢;因此,即使不需要事务支持,很多人也选择InnoDB引擎,这个因素很重要!
1.6 MySQL时间线(Timeline)
回顾了各版本的历史,从2001到2013...
1.7 MySQL的开发模式
依然遵循GPL,Oracle提供付费插件,定期发布GA版和实验室版...
1.8 总结
...