zoukankan      html  css  js  c++  java
  • InnoDB存储引擎概述--文件,表,索引,锁,事务的原理与实现

    1 文件

    InnoDb存储引擎文件:

    表空间文件

    重做日志文件

    2 表

    表按照主键顺序组织存放,也成为索引组织表.

    未指定主键时的选择:选取该表第一个定义的非空唯一索引作为主键,否则自动创建一个6字节大小的指针.

    2.1 视图

    2.2 分区表

    3 索引

    3.1 B+树索引

    3.1.1 聚集索引  Clustered Index

    按照主键构造B+树,叶子节点存放的即为整张表的行记录数据(也称为数据页).

    聚集索引的存储并不是物理上连续的,而是逻辑上连续的.(数据页通过双向链表链接,按主键顺序排序;每个页中的记录也是通过双向链表维护,物理存储上同样可以不按主键存储).

    3.1.2 辅助索引  Secondary Index

    3.1.3 索引管理

    3.1.3.1 Fast Index Creation

    创建辅助索引时,对表加上S锁,注意此时只能对表进行读操作,若有大量的事务需要对目标表进行写操作,数据库服务将不可用.

    删除索引只需要更新内部视图.

    只适用于辅助索引,对主键的创建和删除仍然需要重建表.

    3.1.3.2 Online Schema Change

    含义是在事务的创建过程中,可以有读写事务对表进行操作,提高了原有的MySQL数据库在DDL操作时的并发性.

    3.1.3.3 Online DDL

    允许在创建辅助索引的同时,还允许诸如INSERT,UPDATE,DELETE这类DML操作.

    包括辅助索引的创建和删除,改变自增长值,添加和删除外键约束,列的重命名都可以是在线的.

    新的ALTER TABLE语法

    ALGORITHM中DEFAULT表示依据参数old_alter_table来判断是否是使用INPLACE,COPY算法;COPY表示按照5.1版本之前的模式,即创建临时表;INPLACE表示索引创建和删除时不需要创建临时表.

    LOCK为索引创建或删除时对目标表添加锁的情况:

    NONE  不添加任何锁

    SHARE  与FIC类似,对目标表加S锁.对于并发的读事务,依然可以执行;但是遇到写事务,就会发生等待操作.

    EXCLUSIVE  对目标表加X锁.读写事务都不能进行,因此会阻塞所有的线程.

    DEFAULT

    3.1.4 B+树索引的使用

    3.1.4.1 联合索引

    3.1.4.2 覆盖索引 Covering Index

    从辅助索引中就可以得到查询的记录,而不需要查询聚集索引中的记录.

    好处:

    1.辅助索引不包含整行记录的所有信息,故其大小远小于聚集索引,因此可以减少大量的IO操作;

    2.对于某些统计问题,并不需要查询聚集索引.

    3.1.4.3 FORCE INDEX & USE INDEX

    3.1.4.4 MRR优化 & ICP优化

    MRR场景: range, ref, eq_ref

    ICP场景: range, ref, eq_ref, ref_or_null

    3.2 哈希索引

     哈希索引只能用来搜索等值的查询.

    3.3 全文索引

    3.3.1 原理

    采用full inverted index的方式,{单词,(单词所在文档的ID,在具体文档中的位置)}.

    将word存放到一张表中,称为Auxiliary Table.

    FTS Index Cache

    3.3.2 使用

    NATURAL LANGUAGE

    IN BOOLEAN

    Query Expansion

    4 锁

    4.1 InnoDB中的锁

    InnoDB支持两种行级锁: 共享锁S,排他锁X

    也支持两种表级的意向锁:意向共享锁IS,意向排它锁IX

    4.1.1 一致性非锁定读

    读取的行正在执行UPDATE或DELETE操作,会去读取行的一个快照数据.

    快照数据是指该行的之前版本的数据,通过undo段实现.undo用来在事务中回滚数据,因此快照数据本身没有额外的开销.

    READ COMMITTED: 读取被锁定行的最新一份快照数据

    REPEATABLE READ: 读取事务开始时的行数据版本

    4.1.2 一致性锁定读

    SELECT ... FOR UPDATE 对读取的行记录加一个X锁

    SELECT ... LOCK IN SHARE MODE 对读取的行记录加一个S锁

    4.1.3 自增长与锁

    MySQL5.1.22版本前: AUTO_INC Locking采用一种特殊的表锁机制,锁不是在一个事务完成后才释放,而是在完成对自增长值插入的SQL语句后立即释放.

    设置nnodb_autoinc_lock_mode控制自增长的模式.

    4.1.4 外键与锁

    4.2 锁的3种算法

    Record Lock

    Gap Lock: 阻止多个事务将记录插入到同一个范围中,而这会导致Phantom Problem的产生.

    Next-Key Lock: 解决Phantom Problem.

    REPEATABLE READ下,采用Next-Key Lock的方式加锁.

    READ COMMITTED下,采用Record Lock的方式加锁.

    4.3 锁问题

    脏读,幻读,丢失更新

    4.4 死锁的解决

    等待图wait-for graph进行死锁检测,通常采用深度优先算法实现.

    5 事务

    5.1 事务的分类

    扁平事务: 不能提交和回滚事务的某一部分

    带保存点的扁平事务: 

    链事务: 

    嵌套事务: MySQL或InnoDB都不支持

    分布式事务:隔离级别必须设置为SERIALIABLE。

    5.2 事务的实现

    5.2.1 redo log

    事物日志通过redo日志和日志缓冲(InnoDB Log Buffer)实现。

    恢复提交事务修改的页操作,通常是物理操作,记录的是页的物理操作,保证事务的原子性和持久性.

    参数innodb_flush_log_at_trx_commit用来控制重做日志刷新到磁盘的策略.

    5.2.2 undo log

    回滚行记录到某一个特定版本,是逻辑日志,根据每行记录进行记录,保证事务的一致性.

    undo存放在数据库内部的一个特殊段(segment),被称为undo段.undo段位于共享表空间内.

    undo除了回滚外,还可以MVCC.(即该记录已经被其他事物占用,当前事务可以通过undo读取之前的行版本信息,以实现锁定行读取.)

    purge用于最终完成delete和update操作.实现方式是history list.

    5.2.3 二进制日志 binlog

    一种逻辑日志,其记录的是对于的SQL语句.只在事务提交完成后进行一次写入.

    5.2.4 group commit

    一次fsync可以刷新确保多个事务日志文件被写入文件.

    MySQL5.6 采用了Binary Log Group Commit(BLGC),实现方式为

    6 备份

    6.1 逻辑备份

    mysqldump: 可以导出存储过程,触发器,事件,数据,但是不能导出视图.

    SELECT * INTO OUTFILE

    LOAD DATA INFILE

    mysqlimport

    6.2 二进制日志的备份与恢复

    命令mysqlbinlog可以完成二进制日志的恢复.

    6.3 热备份

    InnoDB官方提供的热备工具是ibbackup;

    XtraBackup是Percona公司开发的开源热备工具,其实现了增量备份.

    6.4 快照备份

    MySQL数据库本身并不支持快照功能,因此快照备份是指通过文件系统支持的快照功能对数据库进行备份.

    支持快照功能的文件系统和设备包括了FreeBSD的UFS文件系统,Solaris的ZFS文件系统,GNU/Linux的逻辑管理器.

    6.5 复制

  • 相关阅读:
    jsonp
    web系统中上下移动功能的实现
    重载的目的是什么
    重写和重载
    final和static
    static的应用
    shiro认证
    做阉割版Salesforce难成伟大的TOB企业
    Go语言在国产CPU平台上应用前景的探索与思考
    101 More Security Best Practices for Kubernetes
  • 原文地址:https://www.cnblogs.com/cheungchein/p/8762327.html
Copyright © 2011-2022 走看看