高性能mysql读书笔记(一)

来源:互联网 发布:不用网络的游戏大全 编辑:程序博客网 时间:2024/06/05 18:13

1 mysql的架构与历史:

1.1 mysql逻辑架构

mysql将查询等处理与数据存储相分离的,可以更加灵活的选取数据存储的方式。mysql处理架构:连接处理->解析器->查询缓存->优化器->存储引擎。

第一层:连接处理:包括主要的授权登录、安全。(action层filter拦截器)

第二层:包括大部分数据库支持的服务,查询解析、优化、数据缓存、以及内置函数等。(service事务层)

第三层:存储引擎负责数据的存储与提取,存储引擎执行比如开始一个事物或者根据主键查询一条记录的具体操作。(相当于dao层)

连接管理:先进行身份验证,之后进行操作权限验证。

优化与执行:mysql解析查询,创建内部数据结构,优化包括:重写查询、决定表的读取顺序、选择合适的索引。

1.2 mysql并发控制

mysql并发控制主要在两个层面,服务器层和存储引擎层面。解决并发控制的经典做法是:通过共享锁(读锁)和排他锁(写锁),写锁会阻塞其他的写锁和读锁。锁的策略就是在安全性和锁的开销之间的平衡性。锁的开销主要有获得锁、检查锁、释放锁,锁的粒度的问题,mysql主要提供了两种粒度的锁:表锁、行级锁。表锁是开销最小的锁策略,会锁定整张表。行锁能最大限度的支持并发处理,相应的是开销最大,行锁实现在存储引擎层,在服务器层没有实现。

1.3 事务

事务就是一组原子性的sql查询,事务内的语句要么全部执行,要么执行失败,事务需要具有ACID特性,典型例子就是银行转账,ACID表示原子性(atomicity)、一致性( consistency)、隔离性(isolation)和持久性(durability),在应用逻辑中实现事务的ACID几乎不可能。
数据库隔离级别主要有四种,mysql使用的是可串行化、repetable read(可重复读)、(read commited)提交读、(read uncommited)未提交读,提交读:对表进行更新,不提交事务,读取数据发现还是原数据,提交事务后读取的是新的数据,在提交事务前所做的修改对于读是不可见的。不可重复读:进行一个A事务,读记录,B事务插入数据,A事务执行相同的查询,两次得到不同的结果(幻读的问题)。
死锁产生的条件:互斥条件、不可剥夺条件、请求和持有、循环等待条件,数据库引入死锁检测死锁超时机制
事务日志处理:事务日志处理可以提高数据库性能,在进行事务操作时,存储引擎会把修改内存拷贝,再把该行为记录到日志文件(在磁盘中采用顺序追加的方式)中去,事务日志被持久化后,再将内存数据写入磁盘,这被称为预写式日志,修改数据库数据需要两次磁盘读写。
mysql事务采用默认提交方式,每个查询被当做事务提交。

1.4 mysql的存储引擎

mysql为每个数据库(或者叫schema)新建一个子目录,创建表时会在数据库子目录下新建一个和表同名的.frm文件保存表的定义。
InnoDB是mysql的默认存储引擎,处理大量短期事务,这样的短期事务几乎不要求回滚。
InnoDB数据存储在tablespace中,采用MVCC实现高并发,实现了四个层面的隔离,InnoDB默认使用可重复读,并通过间 隙锁(间隙锁不仅锁定查询涉及的行,而且对索引中的间隙进行锁定)防止出现幻读。InnoDB表基于聚簇索引,聚簇索引必须包含主键,与平台无关,InnoDB能够通过在内存中创建自适应hash表,加快读操作。能够建立插入操作的插入缓存区。