InnoDB -- 事务隔离级别
本文主要介绍InnoDB的事务隔离级别关于Next-Key Lock的内容,请参照「InnoDB备忘录 - Next-Key Lock」,这里不再赘述
脏读、不可重复读、幻读脏读在不同的事务下,当前事务可以读到其它事务中尚未提交的数据,即可以读到脏数据
不可重复读在同一个事务中,同一个查询在T1时间读取某一行,在T2时间重新读取这一行时候,这一行的数据已经发生修改,不可重复读的重点是修改(Update)
幻读在同一事务中,同一查询多次进行,由于包含插入或删除操作的其他事务提交,导致每次返回不同的结果集,幻读的重点在于插入(Insert)或者删除(Delete)
两类读操作一致性非锁定读
InnoDB通过行多版本控制的方式来读取当前执行时间数据中行的数据,如果读取的行正在执行DELETE或UPDATE操作,这时读操作不会等待行上锁的释放,而是读取行的一个快照数据
非锁定读机制极大地提高了数据库的并发性,这是InnoDB默认的读取方式
READ COMMITED和REPEATABLE READ支持一致性非锁定读:在READ COMMITED下,总是读取被锁定行的最新的快照数据,在REPEATABLE RE ...
InnoDB -- Next-Key Lock
本文主要介绍InnoDB存储引擎的Next-Key Lock
MVCC
InnoDB支持MVCC,与之MVCC相对的是LBCC
MVCC中读操作分两类:Snapshot Read(不加锁)和Current Read(加锁)
MVCC的好处:**Snapshot Read不加锁**,并发性能好,适用于常规的JavaWeb项目(OLTP应用)
隔离级别InnoDB支持4种事务隔离级别(Isolation Level)
隔离级别
描述
READ UNCOMMITTED (RUC)
可以读取到其他事务中尚未提交的内容,生产环境中不会使用
READ COMMITTED (RC)
可以读取到其他事务中已经提交的内容,Current Read会加锁,存在幻读现象,Oracle和SQL Server的默认事务隔离级别为RC
REPEATABLE READ (RR)
保证事务的隔离性,Current Read会加锁,同时会加Gap Lock,不存在幻读现象,InnoDB的默认事务隔离级别为RR
SERIALIZABLE
MVCC退化为LBCC,不区分Snapshot Read和Current ...
InnoDB -- B+Tree索引
本文主要介绍InnoDB存储引擎的B+Tree索引
B+Tree数据结构
所有叶子节点出现在同一层
叶子节点包含关键字信息
叶子节点本身构成单向有序链表
叶子节点内部的记录也构成单向有序链表
索引节点不包含关键字信息,这样能容纳更多的索引信息,B+Tree的高度很低,查找效率很高
关于B+Tree的更多内容请查看维基百科
MyISAM与InnoDBMyISAM
索引文件与数据文件是**分离**的
MyISAM的索引文件采用B+Tree索引
叶子节点data域记录的是**数据存放的地址**
主索引(唯一)与辅助索引(可重复)在结构上没有任何区别
InnoDB
数据文件本身是按照B+Tree组织的索引结构(主索引:Primary Index或聚集索引:Clustered Index),而叶子节点data域记录的是**完整的数据信息**
InnoDB**必须有主键**,如果没有显式定义主键或非NULL的唯一索引,InnoDB会自动生成6 Bytes的ROWID作为主键
辅助索引(Secondary Index)也是按B+Tree组织,叶子节点data域记录的是**主键值**,因此主键不宜定义太大 ...
InnoDB -- 数据页结构
本文主要介绍InnoDB存储引擎的数据页结构
数据页结构
File Header参考链接:Fil Header
总共38 Bytes,记录页的头信息
名称
大小(Bytes)
描述
FIL_PAGE_SPACE
4
该页的checksum值
FIL_PAGE_OFFSET
4
该页在表空间中的页偏移量
FIL_PAGE_PREV
4
该页的上一个页
FIL_PAGE_NEXT
4
该页的下一个页
FIL_PAGE_LSN
8
该页最后被修改的LSN
FIL_PAGE_TYPE
2
该页的类型,0x45BF为数据页
FIL_PAGE_FILE_FLUSH_LSN
8
独立表空间中为0
FIL_PAGE_ARCH_LOG_NO
4
该页属于哪一个表空间
Page Header参考链接:Page Header
总共56 Bytes,记录页的状态信息
名称
大小(Bytes)
描述
PAGE_N_DIR_SLOTS
2
在Page Directory中Slot的数量,初始值为2
PAGE_HEAP_TOP
2
堆中第一个记录的指针
PA ...
InnoDB -- 行记录格式
本文主要介绍InnoDB存储引擎的行记录格式ROW_FORMAT
分类
Named File Format
InnoDB早期的文件格式(页格式)为Antelope,可以定义两种行记录格式,分别是Compact和Redundant
Named File Format为了解决不同版本下页结构的兼容性,在Barracuda可以定义两种新的行记录格式Compressed和Dynamic
变量为innodb_file_format和innodb_default_row_format
123456789101112131415mysql> SHOW VARIABLES LIKE 'innodb_file_format';+--------------------+-----------+| Variable_name | Value |+--------------------+-----------+| innodb_file_format | Barracuda |+--------------------+-----------+1 row in set ( ...
InnoDB -- 逻辑存储
本文主要介绍InnoDB存储引擎的逻辑存储结构
逻辑存储结构
Tablespace
Tablespace是InnoDB存储引擎逻辑存储结构的最高层,所有数据都存放在Tablespace中
分类
System Tablespace
Separate Tablespace
General Tablespace
System Tablespace
System Tablespace即我们常见的共享表空间,变量为innodb_data_file_path,一般为ibdata1文件
里面存放着undo logs,change buffer,doublewrite buffer等信息(后续将详细介绍),在没有开启file-per-table的情况下,还会包含所有表的索引和数据信息
没有开启file-per-table时存在的问题
所有的表和索引都会在System Tablespace中,占用空间会越来越大
碎片越来越多(如truncate table时,占用的磁盘空间依旧保留在System Tablespace)
12345678910111213141516171819mysql> SHO ...
Git -- Git Flow
主要介绍Git Flow中Feature分支、Release分支、Hotfix分支的流程
Git Flow
初始化仓库git flow init:初始化仓库,支持GitFlow分支模型
12345678910111213141516171819202122232425262728293031323334353637383940414243444546$ git clone https://github.com/hzmajia/gitflow-example.gitCloning into 'gitflow-example'...warning: You appear to have cloned an empty repository.Checking connectivity... done.$ cd gitflow-example && git flow initNo branches exist yet. Base branches must be created now.Branch name for production releases: [maste ...
Git -- 仓库瘦身
本文主要介绍两种减少.git仓库磁盘大小的两种方式:git gc和git prune
git gc
适用于存在大文件,且多次提交都只是轻微改动该大文件的场景,因为这些提交都会生成大小相近的大文件blob对象,非常占用磁盘空间
Git最初向磁盘中存储对象使用松散的格式,后续会将多个对象打包为一个二进制的包文件(packfile),以节省磁盘空间
.pack文件存储了对象的内容
.idx文件存储了包文件的偏移信息,用于索引具体的对象
打包对象时,查找命名和大小相近的文件,保留文件不同版本之间的差异(最新一版保存完整内容,访问频率最高)
verify-pack -v *.idx:查看压缩包内容
添加随机(压缩率低)字符大文件bigfile并提交
1234567891011121314151617181920212223242526272829303132333435363738$ git initInitialized empty Git repository in /home/zhongmingmao/demo/.git/$ dd if=/dev/urandom of=./bigfile bs=1k ...
Git -- 对象
本文将主要介绍blob对象,tree对象,commit对象,tag对象
.git核心
.git/HEAD:一般情况下,指向分支引用;如果直接指向提交对象,将处于detached HEAD状态
.git/index:暂存区信息
.git/objects:Git对象数据
.git/refs:引用信息,包括分支引用,标签引用等
1234567891011121314151617181920212223242526272829303132333435363738$ git log --oneline --decorate --graph --all* ae432e4 (HEAD -> master) echo master > file* daa44e8 add file$ ls .gitbranches COMMIT_EDITMSG config description HEAD hooks index info logs objects ORIG_HEAD refs rr-cache$ cat .git/HEADref: refs/heads/master$ cat ...
Git -- 合并
本文主要介绍合并中断,查看冲突,冲突相关的提交,撤销合并
中断合并git merge --abort:当出现冲突时,放弃当前合并,尝试恢复到合并前的状态
1234567891011121314151617181920212223242526272829303132$ git branch -v dev 43b3f7b echo dev > file* master 3f112d7 echo master > file$ git diff dev # conflict existsdiff --git a/file b/fileindex 38f8e88..1f7391f 100644--- a/file+++ b/file@@ -1 +1 @@-dev+master$ git merge devAuto-merging fileCONFLICT (content): Merge conflict in fileAutomatic merge failed; fix conflicts and then commit the result.$ gstOn branch masterY ...