阅读《高性能mysql第三版》笔记(一)

阅读《高性能mysql第三版》笔记(一)

前言:全文笔记都是阅读书籍记录的,请各位大佬多多指教,有不对的地方指点一番。谢谢!

(1)MySQL的逻辑架构

阅读《高性能mysql第三版》笔记(一)_第1张图片
第一层架构:连接MySQL的客户端,可以是Navicat,SQLyog,或者代码的JDBC连接等等。每一个SQL的执行都是一个线程的创建和销毁过程,但是在MYSQL5.5版本只有进行的优化,会有ThreadPool的概念,减少消耗。
第二层架构:MySQL的核心层,里面包括触发器,存储过程,视图,内置函数,缓存,解析和分析等等。
第三层架构:是存储引擎,(原文)负责mysql数据的存储和提取。存储引擎主要分为InnoDB和MyISAM,还有MEMORY、ARCHIVE等等其他的。存储引擎InnoDB会解析SQL的外键,而MYISAM不会。

(2)并发控制

在并发情况下,我们读取的数据被修改了,这个时候读取的结果是不确定的。为了能控制这个问题的产生于是就有了读锁和写锁,也叫共享锁和排它锁。

读锁是共享的,不相互堵塞多个用户在同一时刻可以同时读取同一资源。
写锁是排他的,一个写锁会阻塞其他的写锁和读锁。

(3)锁粒度

每种MySQL存储引擎都可以实现自己的锁策略和锁粒度。下面介绍两种重要的策略。

表锁:它锁定整张表,阻塞其他用户对表的读写操作。
行级锁:可以最大程度的支持并发操作。后续介绍。

(4)隔离级别

(READ UNCOMMITTED)未提交读:在事务未提交的时候,对其他事务是可见的,产生脏读现象;

(READ COMMITTED)提交读(不可重复读):一个事务提交之前,只对自己可见,别人是不可见的。

(REPEATABLE READ)可重复读:提交读会产生幻读现象,指的是当某一个事务在读取某一个范围内的记录时,另一个事务又在该范围内插入新的记录,当之前事务再次读取数据时,会有幻行现象。InnoDB和XtraDB通过MVCC技术解决了幻读问题。

(SERIALIZABLE)串行化:强制事务串行化,避免幻读。只有在强一致性上,才会使用该隔离级别。

MYSQL可以通过执行 set transactional isolation level [隔离级别];

(5)死锁

死锁是指两个或者更多的事务在同一资源进行抢占,导致死锁问题。
原文例子(如下图):当两个事务,在同一时间对第一行数据进行修改,当尝试执行第二条语句是,会等待对方释放锁,会产生死锁问题,陷入死循环。
阅读《高性能mysql第三版》笔记(一)_第2张图片
解决办法:(1)死锁检测和超时连接。

(6)多版本并行控制

MySQL的大多数事务型存储引擎实现的都不是简单的行级锁。基于提升并发性能的考虑,它们一般同时实现多版本并发控制,也就是MVCC。MVCC的实现,是通过保存数据在某个时间点的快照来实现的。【原文有一句话描述未懂】-“不管需要执行多长时间,每个事务看到的数据都是一致的。根据事务开始的时间不同,每个事务对同一张表,同一时刻看到的数据可能是不一样的”。
MYSQL的实现是通过每一行记录后面保存两个隐藏的列来实现的。这两个列。一个保存行的创建时间,一个保存行的过期时间(或删除时间),当然不是存储实际的时间,而是系统版本号。下面看一下在repeatable read隔离级别下,MVCC具体是如何操作的。
select
InnoDB会根据以下两个条件检查每行记录:
a,InnoDB会查询版本早于当前事务版本的数据行,这样可以确保事务读取的行,要么是在事务开始已经存在的,要么是事务自身插入或者修改的。
b,行的删除版本要么未定义,要么大于当前事务版本号,这样可以确保事务读取到的行,在事务开始之前未被删除。
insert
InnoDB为新插入的每一行保存当前系统版本号作为行版本号。
delete
InnoDB为删除的每一行保存当前系统版本号作为删除标志。
update
InnoDB为插入一行新记录,保存当前系统版本号作为行版本号,同时保存当前系统版本号到原来的行作为行删除标志。

注意:MVCC只在可重复读和不可重复读(提交读)两个隔离级别下工作,其他两个隔离级别和MVCC不兼容;
read committed总是读取最新的数据行,而不是符合当前事务版本的数据行,而serializable则会对所有读取的行都加锁。

(7)InnoDB概览

InnoDB的数据存储在表空间(tablespace)中,表空间是由InnoDB管理的黑盒子,由一系列的数据文件组成。

InnoDB采用MVCC支持高并发,并且实现了四个标准的隔离级别。其中默认的隔离级别是可重复读,并且通过间歇锁策略防止幻读的出现。间歇锁是的InnoDB不仅仅锁定查询涉及的行,还会对索引中的间歇进行锁定,以防止幻影行的插入。

InnoDB表是基于聚簇索引建立的,索引结构和MySQL的其他存储引擎有很大不同,聚簇索引对主键查询有很高的性能。不过它的二级索引中必须包含主键列,所以如果主键很大的话,其他的所有索引都很大。

(8)MYISAM存储引擎

缺点:(1)不支持事务和行级锁
(2)系统崩溃无法安全恢复。
myisam是比较早数据库默认版本,缺点有点多,有时候性能又不足InnoDB,比如建立索引之后MYISAM就无法比拟InnoDB。(所以略过)

你可能感兴趣的:(mysql,mysql,java)