《MySQL技术内幕:InnoDB存储引擎第⼆版》读书笔记
《MySQL技术内幕:InnoDB存储引擎第⼆版》读书笔记
第⼀章 MySQL体系结构和存储引擎
shell脚本创建文件并写入内容MySQL被设计为⼀个可移植的数据库,⼏乎能够在所有系统上运⾏,如Linux 、windows等等,虽然各平台在底层(如线程)的实现⽅⾯各有不同,但是MySQL基本能保证在各平台上的物理体系结构的⼀致性。
1.定义数据库和实例
1.数据库:物理操作系统⽂件或其他形式⽂件的集合,在MySQL数据库中,数据库⽂件可以是frm 、MYD 、MYI 、ibd结尾的⽂件。当使⽤NDB引擎时,数据库中的⽂件可能不是操作系统上的⽂件,⽽是存放于内存中的⽂件,但定义仍不变。
2.实例:由后台线程及⼀个共享内存区组成,共享内存区可以被后台运⾏的线程共享,需要牢记 ,数据库实例才是真正操作数据库⽂件的。注意:
1. MySQL数据库中实例和数据库通常是⼀⼀对应的(即⼀个实例对应⼀个数据库),但是在集的情况下,可能存在⼀个数据库被多个
实例使⽤的情况。makefile的编写
2. MySQL数据库是单进程多线程架构的,与Oracle的多进程架构不同(windows下,Oracle也是单进程多线程架构)。也就是
说,MySQL数据库实例在系统上的表现就是⼀个进程。
3. 看例⼦,课本P14 - P16。
2.MySQL体系结构
(1).进⼀步讲解数据库与实例
1.数据库是⽂件集合。
2.数据库实例是是程序,包括数据库定义 、数据查询 、数据维护 、数据库运⾏控制等都是在数据库实例下进⾏的应⽤程序只有通过数据库实例才能和数据库打交道。
3.数据库是由⼀个个⽂件组成的,要对这些⽂件执⾏诸如SELECT 、INSERT 、DELETE 和UPDATE 等数据库操作不能通过简单地操作(修改)⽂件来更改数据库的内容,需要通过数据库实例来完成对数据库的操作。
4.所以⽤户把Oracle 、MySQL简单理解为数据库其实是有误的,但实际开发中并没有强调这些区别。
(2).MySQL体系结构图
注:这⾥参考了别⼈的⽂章
mysql语句转oracle1.Connectors:连接者,不同语⾔的代码程序与MySQL的交互(SQL交互)。
2.连接池组件:管理 、缓冲⽤户的连接。
3.管理服务和⼯具组件:系统管理和控制⼯具,⽐如备份恢复 、MySQL复制 、集等等。
4.SQL接⼝组件:接收⽤户的SQL命令,并返回⽤户的操作(⽐如 查询操作)的结果。
5.查询解析器组件:SQL语句传递到解析器的时候会被解析器验证和解析(⽐如 解析权限 、语法结构等等)。
6.优化器组件:SQL语句在查询之前会使⽤查询优化器进⾏优化,⽐如
SELECT id, name FROM user WHERE age = 40;
1. 这个select 查询先根据where 语句进⾏选取,⽽不是先将表全部查询出来以后再进⾏age过滤 ;
2. 这个select查询先根据id和name进⾏属性投影,⽽不是将属性全部取出以后再进⾏过滤;
3. 将这两个查询条件联接起来⽣成最终查询结果。
7.缓冲组件(缓存组件):如果查询到缓存中存在想要查询的结果,那么可以直接去缓存中取出数据。
8.插件式存储引擎(最重要的成员,MySQL独有的概念):存储引擎说⽩了就是管理操作数据的(⽐如说存储数据 、查询 、更新等等)⼀种⽅式,因为关系数据库中数据是以表的形式存储的,所以存储引擎也可以称作为表类型(即存储和操作此表的类型),3-7这⼏个组件的底层物理结构都是有存储引擎来实现的,存储引擎是基于表的,⽽不是基于数据库的。
9.物理⽂件:⽇志⽂件,数据⽂件,配置⽂件,pid⽂件,socket⽂件等。
3.MySQL存储引擎
在Oracle 和 SQL Server 等数据库中,所有数据存储管理机制都是⼀样的。⽽MySQL数据库提供了多种存储引擎。
⽤户可以根据不同的需求为数据库表选择不同的存储引擎,⽤户也可以根据⾃⼰的需要编写⾃⼰的存储引擎。
甚⾄⼀个库中不同的表使⽤不同的存储引擎也是允许的。
(1).InnoDB存储引擎
1.InnoDB存储引擎⽀持事务,其设计⽬标主要⾯向在线事务处理(OLTP)的应⽤。其特点就是⾏锁设计 、⽀持外键,并⽀持类似于Oracle的 ⾮锁定读,即默认读取操作不会加锁。从MySQL 5.5.8版本开始,InnoDB存储引擎成为默认的存储引擎。
2.InnoDB存储引擎将数据存放在⼀个逻辑的表空间⾥,这个表空间就像⿊盒⼀样由InnoDB存储引擎⾃⾝进⾏管理。
3.InnoDB通过多版本并发控制(MVCC)来获得⾼并发性,并且实现了SQL的四个隔离级别,默认级别是 REPEATABLE 级别。同时使⽤next-key locking的策略来避免幻读。此外,InnoDB还提供了插⼊缓冲(insert buffer) 、⼆次写 (double write)、⾃适应哈希索引、预读(read ahead)等⾼性能⾼可⽤的功能。
4.InnoDB采⽤聚集的⽅式来存储表中的数据,所以每张表中的每⾏数据都会按照主键的顺序进⾏存放,如果没有在表中定义主键,InnoDB 存储引擎会⾃动为每⼀⾏⽣成⼀个6字节的ROWID,并把它作为当前⾏的主键值。
5.InnoDB是MySQL数据库最常⽤的存储引擎,它具有⾼性能 、⾼可⽤性和⾼可扩展性。
(2).MyISAM存储引擎
1.MyISAM存储引擎不⽀持事务 、表锁设计 、外键等等,⽀持全⽂索引,因此访问速度快。主要⾯向⼀些在线访问处理(OLAP)的数据库应⽤.
2.MyISAM存储引擎的缓冲池只缓存索引⽂件,所以不缓存数据⽂件。
3.MyISAM存储引擎由MYD和MYI组成,MYD⽤来存放数据⽂件,MYI⽤来存放索引⽂件。
python sqrt函数4.对事务完整性没有要求并以访问为主的应⽤适合使⽤该存储引擎。
(3).NDB存储引擎
1.它是⼀个集存储引擎,类似于Oracle的RAC集,不过与RAC share everything架构不同的是,其结构是 share nothing的集架构,因此具有更⾼的可⽤性。
2.NDB的特点是他将数据存储在内存中(可以将⾮索引数据放在磁盘),因此主键查速度特别快;但是要注意的是,NDB存储引擎的连接操作是在数据库层完成的,⽽⾮在存储引擎层,复杂的连接操作需要巨⼤的⽹络开销,所以查询速度很慢。cms采集
(4).Memory存储引擎
1.Memory存储引擎将数据存放在内存中,如果数据库重启或者崩溃,数据将丢失,所以不安全,适合⽤于存储临时数据的临时表.
2.存储引擎默认使⽤哈希索引⽽不是 B+树 索引,查速度⾮常快。
3.使⽤上有⼀定限制,⽐如,只⽀持表锁,并发性能差,不⽀持TEXT 、BLOD 列数据类型,变长字段VARCHAR 使⽤效果和定长字段CHAR 相同。
4.MySQL数据库使⽤Memory存储引擎作为临时表存放查询的中间结果集,如果中间结果集⼤于Memory存储引擎表的容量设置,⼜或者中间结果集中含有TEXT 或BLOD 列类型字段,则MySQL数据库会把其转换到MyISAM存储引擎表进⽽存放到磁盘中。但是MyISAM不缓存数据⽂件,因此这是产⽣的临时表的性能对于查询会有损失。
(5).Archive存储引擎
1.Archive存储引擎只⽀持 INSERT 、SELECT 操作,MySQL5.1版本起⽀持索引。
2.使⽤zlib算法将数据⾏进⾏压缩后存储,压缩⽐⼀般可达 1 : 10。
3.适合⽤来存储归档数据,如⽇志信息
4.使⽤⾏锁来实现⾼并发的插⼊操作,但本⾝并不是事务安全的存储引擎,其设计⽬的主要是提供快速的插⼊和压缩功能。
(6).Federated存储引擎
1.不是存放数据⽤的,⽽是只是指向⼀台远程MySQL数据库服务器上的表。
2.类似SQL Server的链接服务器和Oracle的透明⽹关,不同的是,Federated存储引擎只⽀持lMySQL数据库表,不⽀持异构数据库表。
(7).Maria存储引擎
1.是MyISAM存储引擎的后续版本,开发者是MySQL创始⼈之⼀,设计⽬的是为了替换MyISAM存储引擎,从⽽成为MySQL的默认存储引擎。
2.⽀持缓存数据和索引⽂件,应⽤⾏锁设计,提供MVCC功能,⽀持事务和⾮事务的安全选项,更好的BLOD字符类型处理性能。
(8).BlackHole存储引擎
⿊洞存储引擎,写⼊的任何数据都会消失,可以应⽤于主备复制中的分发主库。
(9).其他存储引擎
还有Merge 、CSV 、Sphinx 、Infobright等存储引擎,他们都有各⾃的应⽤场景。
4.各存储引擎之间的⽐较
1.存储引擎是MySQL体系结构的核⼼。
2.数据库与⽂件系统的最⼤区别在于,数据库⽀持事务
3.看课本例⼦,P24 - P26。
4.虽然MySQL有许多的存储引擎,但是它们之间不存在优劣性的差异,⽤户应该根据不同的应⽤选择合适⾃⼰的存储引擎。
第⼆章 InnoDB存储引擎python编程快速入门
InnoDB存储引擎是事务安全的MySQL存储引擎,是OLTP应⽤中核⼼表的⾸选存储引擎。
1.InnoDB存储引擎概述
该引擎是第⼀个完全⽀持ACID 事务的MySQL存储引擎,其特点就是⽀持⾏锁设计 、⽀持外键 、⽀持MVCC 、提供⼀致性⾮锁定读同时被设计来最有效地利⽤和使⽤内存和CPU。
2.InnoDB存储引擎的版本
多滚回段:可以提⾼⽀持的并发事务数量。
3.InnoDB体系架构
InnoDB存储引擎有多个内存块,可以认为这些内存块组成了⼀个⼤的内存池,内存池负责:
1.维护所有进程和线程需要访问的多个内部数据结构。
2.缓存磁盘上的数据,⽅便快速地读取,同时在磁盘⽂件的数据修改之前在内存池缓存。
3.重做⽇志缓冲等等。
4.后台线程主要是为了刷新内存池中的数据,保证缓冲池的内存缓存是最近的数据。此外还将修改的数据⽂件刷新到磁盘⽂件,保证在数据库发⽣异常的情况下InnoDB能恢复正常的运⾏状态。
(1).后台线程
InnoDB存储引擎是⼀个多线程的模型,其后台运⾏着多个后台线程,负责着不同的任务:
1.Master Thread:InnoDB存储引擎的核⼼线程,负责将缓冲池中的数据刷新到磁盘,保证数据的⼀致性,包括脏页的刷新 、合并插⼊缓冲池 、UNDO页的回收等等。
2.IO Thread:InnoDB存储引擎使⽤⼤量的AIO 来处理写IO请求,极⼤地提⾼了数据库的性能,该线程主要负责这些IO请求的回调处理。(即该线程负责调⽤AIO)
3.Purge Thread:事务提交后,其所使⽤的的undolog可能不再需要,这时就需要该线程来回收已经使⽤并分配的undo 页。
4.Page Cleaner Thead:将脏页的刷新操作放⼊到⼀个单独的线程中完成;⽬的是为了减轻Master Thread的⼯作及对于⽤户查询线程的阻塞,进⼀步提⾼InnoDB存储引擎额性能。
(2).内存
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论