InnoDB存储引擎概览

时间:2018-06-14 16:11:42   收藏:0   阅读:169

InnoDB存储引擎概览

??InnoDB存储引擎以其平衡了高可靠性和高性能性而闻名遐迩,在MySQL 8.0版本中,InnoDB存储引擎是默认的存储引擎。(历史追溯从MySQL 5.5.5版本开始,默认的存储引擎从MyISAM替换为Innodb)。当然,你也可以指定其他存储引擎,通过CREATE TABLE语句加上ENGINE=xxx指定特定的存储引擎,如表5.1所示。

Innodb的关键特性

为什么使用InnoDB存储引擎

使用InnoDB表的益处如下:

InnoDB存储引擎的使用建议

使用InnoDB存储引擎的使用建议:

验证InnoDB为默认存储引擎

??可通过SHOW ENGINES 语句来查看可用的MySQL存储引擎。查看默认的存储引擎。
语句如下:

(root@localhost) [(none)]> (root@localhost) [(none)]> SHOW ENGINES;

另外一个方法:

SELECT * FROM INFORMATION_SCHEMA.ENGINES;   

InnoDB和ACID模型

??ACID模型对于数据库设计来说,是一项基本准则。在业务数据非常重要的关键性应用具有一种可靠性方面的原则。MySQL的组件中,Innodb引擎是紧密贴合ACID模型进行开发设计的。所以它的数据不会由于软件或者硬件问题导致的异常问题而丢失。当你兼容了ACID原则,你就不需要对数据一致性校验和实例恢复这个问题进行重复造轮子。
??在你拥有了额外软件的守卫保障和可靠性高的硬件保障。亦或者你的应用允许一点点的数据丢失和数据不一致的情况。那么你可以调整MySQL的参数来让它在ACID交易情况下提高更高的性能。ACID的特性,如图5.1所示。
技术分享图片
图5.1 ACID的特性

  1. 原子性
    ??ACID中原子性的方面主要涉及InnoDB transactions的知识点。特性如下:
    • 自动提交设置(Autocommit)
    • COMMIT语句
    • ROLLBACK语句
    • 来自于INFORMATION_SCHEMA表的数据操作
  2. 一致性
    ??ACID中一致性的方面主要涉及InnoDB 的内部处理机制。可以在数据库实例崩溃的情况下恢复数据。相关特性如下:
    • InnoDB两次写(InnoDB doublewrite buffer)
    • InnoDB实例恢复(InnoDB crash recovery)
  3. 隔离性
    ??ACID中隔离性的方面主要涉及InnoDB transactions,主要体现在隔离级别上面(isolation level)。相关特性如下:
    • 自动提交设置(Autocommit)
    • SET ISOLATION LEVEL语句
    • 在InnoDB Locking中有行级锁,在性能调优方面,
      可以通过INFORMATION_SCHEMA表查看细节。
  4. 持久性
    ??ACID中持久性的方面主要通过MySQL软件功能的配置。因为许多特性依赖于硬件本身的性能,例如:CPU,网络,存储。这是在采购硬件的时候,硬件厂商可以提供一个指导方针,超过了本书的讨论范围。相关的MySQL特性如下:
    • InooDB doublewrite buffer。可以通过innodb_doublewrite在配置文件进行配置,来决定是否启动此项功能
    • 配置选项innodb_flush_log_at_trx_commit
    • 配置选项sync_binlog
    • 配置选项innodb_file_per_table
    • 在存储设备中有写缓存区的,例如SSD和RAID磁盘阵列
    • 在存储设备中有Battery-backed cache
    • 在操作系统中,跑了MySQL数据库服务,特别是它支持fsync()系统调用
    • 不间断UPS保护所有服务器和存储设备,不掉电。保护MySQL服务的正常运行和数据存储。
    • 备份策略,通过脚本和异地备份保证数据的可用性。
    • 特别是在分布式应用中,在两个数据中心的网路传输,保证MySQL某些特性功能能顺利运行,例如MySQL Replication

InnoDB多版本控制(Multi-Versioning)

  1. InnoDB多版本控制与机理介绍
    ??InnoDB是一个多版本控制的存储引擎。它可以对已修改的行保留一个旧版本的数据信息。用于支持事务特性。例如:并发和数据回滚。这个信息保留在数据结构中的表空间中,这个表空间称之为rollback segment回滚段。(在Oracle中也有一种类似的数据结构)。
    ??当事务需要回滚的时候,InnoDB会使用回滚段的信息,用于执行undo操作。对于某一行,InnoDB会用早前版本的信息来保障读一致性(consistent read)。
  2. 内部机理
    MySQL数据中InnoDB存储引擎对于每一行会添加三个字段。每一个字段明细如下:
    • 一个6字节的DB_TRX_ID字段,用于指向最后一个事务的事务标识符。这个事务用于删除行或者插入行。当然,删除操作在内部机理中被视为更新操作一类。其中有一个特殊的位(bit)用来标识deleted标志。
    • 一个7字节的DB_ROLL_PTR字段,称之为回滚指针(roll pointer)。用于把undo日志写入回滚段中。如果一个行被更新了,那么undo日志会记录必要的信息,用于重建被更新之前的行数据信息。
    • 一个6字节的DB_ROW_ID字段,包含一个ROW ID。用于一个新行插入的时候单调递增。如果InnoDB自动继承了clutered索引,那么这个索引就包含了ROW ID值。否则,DB_ROW_ID是不会出现在任何索引之中的。

??Undo日志在回滚段(rollback segment)中被分为两部分,一部分叫做插入undo日志(insert undo logs),另外一部分叫做更新undo日志(update undo logs)。插入undo日志只用于事务回滚,如事务一旦提交,那么日志就可以被丢弃。更新undo日志用在读一致性,InnoDB会指定一个数据快照,这个快照的构建来自于更新undo日志中数据行的早期版本。通过数据行早期版本的快照来保证读一致性,如果不需要这种事务数据保护的时候,这个日志可以被丢弃。
??定期提交事务,这些事务只包括一致性读。否则的话,InnoDB不会丢弃更新undo日志,回滚段也许会增长的非常大,填满整个表空间。
??一个undo日志的物理空间大小通常要小于相应的插入行或者更新行的数据大小。所以你可以使用这个信息来统计计算回滚段需要的空间。
??在InnoDB多版本控制的架构下,当你执行delete的SQl语句去删除一行数据的时候,一个行的物理删除并不是马上执行。只要当对于删除类操作的更新undo日志被遗弃掉之后,InnoDB存储引擎会做出物理的删除行操作。这个删除操作称之为purge。这个purge的操作速度是非常快的和SQL语句执行删除操作的时间不分伯仲。

知识点备注:purge
??是一种垃圾收集机制(garbage collection)的类型。这种垃圾收集机制通过一或多个后台进程管理控制(控制参数为innodb_purge_threads)并且周期性地运行。
??Purge会解析和处理来自于历史列表中的undo日志页。对这些日志页(被之前的DELETE SQL语句删除的行)标记为deltetion的clustered和secondary索引日志记录,而且不再为MVCC和回滚所需要。Purge处理完之后会从历史列表中释放掉这些undo日志页。
??如果你以相同的速率小批量的插入或者删除行。那么purge线程会开始滞后。数据表有由于“dead”数据行导致越来越大,导致所有的事情都与磁盘绑定从而非常地慢。在这种情况下,可以调节新行操作的阀门,来分配更多的资源给予purge线程。通过优化系统变量innodb_max_purge_lag

原文:https://www.cnblogs.com/zhangshengdong/p/9183199.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!