日期:2014-05-16  浏览次数:20399 次

学习 MySQL InnoDB 存储引擎之概述

InnoDB 基本的存储结构与 oracle 类似,分别由表空间、段、区和块组成,但它只是相当于 oracle 的一个“简化版”,提供的维护功能远不如后者强大。
例如 InnoDB 的表空间只能在数据库启动前配置,不能像 oracle 那样在运行过程动态维护;它的段只能由存储引擎本身自动管理,而不能像 oracle 那样手工管理;
它的块固定大小是 16 K(除非在源代码中修改),不能像 oracle 可以在不同的表空间配置不同大小的块;同样重做日志方面的维护也需要向 oracle 好好学习。
虽然如此,但它仍然可以像 oracle 那样的非锁定读,即默认情况下读取操作不会产生锁。
并且通过使用多版本并发控制(MVCC)来获得高并发性。它很好的实现了 SQL 标准的四种隔离级别,默认为 REPEATABLE READ。同时使用一种被称为 next-key locking 的策略来避免幻读(phantom)现象的产生。
另外,InnoDB储存引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能。
对于表中数据的存储,InnoDB 存储引擎采用了聚集(clustered)的方式,这种方式类似于 Oracle 的索引聚集表(index organized table,IOT)。

一般来说,oracle 的核心后台进程有 CKPT、DBWn、LGWR、ARCn、PMON、SMON 等。
默认情况下,InnoDB 存储引擎的后台线程有7个:4个 IO thread,1个master thread,1个锁(lock)监控线程,1个错误监控线程。
IO thread 的数量由配置文件中的 innodb_file_ io_threads 参数控制,默认为4。
4个 IO 线程分别是 insert buffer thread、log thread、read thread、write thread。在Linux平台下,IO thread的数量不能进行调整,但是在Windows平台下可以通过参数 innodb_file_io_threads 来增大 IO thread。
InnoDB Plugin 版本开始增加了默认 IO thread 的数量,默认的 read thread 和 write thread 分别增大到了4个,并且不再使用 innodb_file_ io_threads 参数,而是分别使用 innodb_read_io_threads 和 innodb_write_io_threads 参数。

InnoDB 的内存组成:缓冲池(buffer pool)、重做日志缓冲池(redo log buffer)以及额外的内存池(additional memory pool),分别由配置文件中的参数innodb_buffer_pool_size、innodb_log_buffer_size 和 innodb_additional_mem_pool_size 的大小决定。
InnoDB 的工作方式总是将数据库文件按页(每页16K)读取到缓冲池,然后按最近最少使用(LRU)的算法来保留在缓冲池中的缓存数据。
如果数据库文件需要修改,总是首先修改在缓存池中的页(发生修改后,该页即为脏页),然后再按照一定的频率将缓冲池的脏页刷新(flush)到文件。
具体来看,缓冲池中缓存的数据页类型有: 索引页、数据页、undo页、插入缓冲(insert buffer)、自适应哈希索引(adaptive hash index)、InnoDB存储的锁信息(lock info)、数据字典信息(data dictionary)等。




我的异常网推荐解决方案:oracle存储过程,http://www.aiyiweb.com/oracle-develop/177537.html