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和Curre...
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 堆中第一个记录的指针 ...
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 se...
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> ...
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: [ma...
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...
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$ c...
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 mast...
Git -- Reset
本文主要介绍通过reset如何将 HEAD重置到特定的状态 常见工作流程 三个区域HEAD:存储在.git目录,上一次提交对象,下一次提交对象的父提交对象Index:存储在.git目录,暂存区域,用于下一次提交Working Directory:实际的文件 Working Directory->Index->HEADv1 : touch file.txtgit init后尚未有commit,此时master指向不明确 1234567$ git init$ touch file.txt$ gst -sb## Initial commit on master?? file.txt v1 : git add12345$ git add file.txt$ gst -sb## Initial commit on masterA file.txt v1 : git commit1234567891011$ git commit -m 'file.txt v1'[master (root-commit) a5c8857] file.txt v1 1 file ch...














