读书笔记《高性能MySQL》第一章 MySQL架构与历史

今年3月份,早就买了这本《高性能MySQL》,一直还没有去看。前后一起买的,还有一本《MySQL必知必会》,也早已看完。后来,去看了一些其他书籍。像是什么《Redis实战》、《数据结构C语言版》、《Linux命令行与shell脚本编程大全》。不过,我看书一般都是有选择性的看。看能看懂的,看迫切需要掌握的,毕竟贪多嚼不烂。我看书的习惯是:先看目录,看看这本书大致有什么内容,然后,再看看前言,看看作者想告诉我们些什么。这本书总共分为16章,6个附录。我计划每看完4章,就开始做个笔记。非常推荐大家,去购买这本书来看。

MySQL采用三层架构:

第1层
负责连接处理、授权认证、安全等。
第2层
负责查询解析、分析、优化、缓存、内置函数( 例如,日期、时间、数学和加密函数 )、存储过程、触发器、视图等。
第3层
包含了存储引擎,负责数据的存储与提取,服务器通过API与存储引擎进行通信。除了InnoDB会解析外键定义,其它存储引擎一般不会解析SQL,不同存储引擎之间也不会相互通信。


MSQL5.5加入了企业线程池插件( https://dev.mysql.com/doc/refman/5.5/en/thread-pool.html )

MySQL会解析查询,并创建内部数据结构( 解析树 ),包括重写查询、决定表的读取顺序,以及选择合适的索引等。

对于SELECT语句,在解析查询之前,服务器会先检查查询缓存,如果能够在其中找到对应的查询,服务器就不必再执行查询解析、优化和执行的整个操作,而是直接返回查询缓存中的结果集。

并发控制可以采用共享锁、排他锁来解决问题。

锁粒度包含了表锁、行锁( MyISAM不支持行锁,InnodDB支持行锁 )。

事务的ACID概念:原子性( atomicity )、一致性( consistency )、隔离性( isolation )、持久性( durability )。

事务的隔离级别:未提交读( READ UNCOMMITTED )、提交读( READ COMMITTED )、可重复读( REPEATABLE READ )、可串化( SERIALIZABLE ),InnoDB事务的默认隔离级别是可重复读。

隔离级别 脏读 不可重复读 幻读 加锁读
未提交读 Yes Yes Yes No
提交读 No Yes Yes No
可重复读 No No Yes No
可串行化 No No No Yes

MySQL默认采用自动提交模式。每个查询都会被当作一个事务执行,并自动提交。

InnoDB支持通过特定的语句进行加锁,这些语句不属于SQL规范,经常被滥用,实际上应当尽量避免使用,如下:
SELECT … LOCK IN SHARE MODE ( 共享锁 )
SELECT … FOR UPDATE ( 排他锁 )

InnoDB采用MVCC多版本并发控制,MVCC的实现,是通过保存数据在某个时间点的快照来实现的,并保存系统版本号、行记录的版本号。每开始一个新事务,系统版本号都会自动递增。事务开始时刻的系统版本号,会作为事务的版本号,用来和查询的每行记录版本号进行比较。
SELECT时,只查询行的系统版本号,小于或等于事务的系统版本号。行的删除版本,要么未定义,要么大于当前事务版本号。
INSERT时,为插入的每一行,保存当前系统版本号,作为行版本号。
DELETE时,为删除的每一行,保存当前系统版本号,作为行版本号。
UPDATE时,为插入一行新记录,保存当前系统版本号,作为行版本号。同时保存当前系统版本号,到原来的行,作为行删除标识。
MVCC只在“提交读”、“可重复读”两个隔离级别下工作,其他两个隔离级别都和MVCC不兼容。

在MySQL5.1以及之前的版本中,MyISAM是默认的存储引擎。从MySQL5.5.5开始,新表的默认存储引擎改为InnoDB,并引入了InnoDB Plugin的特性。InnoDB采用MVCC来支持高并发,并且实现了4个标准的隔离级别。其默认级别是可重复读,并通过间隙锁策略,防止幻读的出现。InnoDB表是基于聚簇索引建立的。
MyISAM提供大量特性,包括全文索引、压缩、空间函数( GIS )等,但它不支持事务和行级锁,崩溃后无法安全恢复。

内建的其他存储引擎:
1、Archive引擎,只支持INSERT和SELECT,MySQL5.1之前也不支持索引。
2、CSV引擎,能直接读取csv文件,可以作为一种数据交换的机制。
3、Memory引擎,比MyISAM还要快一个数量级,适合需要快速访问,并且不需要修改的数据。重启后数据会丢失,通常作为临时表。因为所有的数据都保存在内存中,所以不需要进行磁盘I/O。
4、NDB集群引擎,MySQL服务器、NDB集群存储引擎,以及分布式的、share-nothing的、容灾的、高可用的NDB数据库的组合,被称为MySQL集群。

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注