北京中科助力白癜风康复 http://finance.sina.com.cn/chanjing/b/20091014/11153079059.shtmlinnodb第一个完整支持ACID事务的MySQL存储引擎(BDB是第一个支持事务的MySQL存,现在已停止开发)。特性:*行锁设计,支持mvcc,支持外键,提供一致性非锁定读,同时被设计用来最有效地利用以及试用内存和cpu。体系架构:innodb存储引擎有多个内存块,可以认为这些内存快组成了一个大的内存池。维护所有进程/线程需要访问的多个内部数据结构。缓存磁盘上的数据,方便快速地读取,同时在对磁盘文件的数据修改之前在这里缓存。重做日志(redolog)缓冲innodb后台线程:MasterThread:是一个非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括脏页的刷新、合并插入缓冲(INSERTBUFFER),undo页的回收等。IOThread:在InnoDB存储引擎中大量使用了AIO(AsyncIO)来处理写IO请求,这样可以极大提高数据库的性能。IOThread的工作主要是负责这些IO请求的回调(callback)处理。InnoDB1.0版本之前共有4个IOThread,分别是write、read、insertbuffer和logIOthread。在Linux平台下,IOThread的数量不能进行调整,但是在Windows平台下可以通过参数innodb_file_io_thread来增大IOThread。PURGEThread:事务被提交后,其所使用的undolog可能不再需要,因此需要PurgeThread来回收已经使用并分配的undo页。在InnoDB1.1版本之前,purge操作仅在InnoDB存储引擎的MasterThread中完成。而从InnoDB1.1版本开始,purge操作可以独立到单独的线程中进行,以此来减轻MasterThread的工作,从而提高CPU的使用率以及提升存储引擎的性能。PageCleanerThread:PageCleanerThread是在InnoDB1.2.x版本中引入的。其作用是将之前版本中脏页的刷新操作都放入到单独的线程中来完成。而其目的是为了减轻原MasterThread的工作及对于用户查询线程的阻塞,进一步提高InnoDB存储引擎的性能。内存:缓冲池:缓冲池简单来说就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可将其视为基于磁盘的数据库系统(Disk-baseDatabase)在数据库总进行读取页的操作首先将从磁盘独到的页存放在缓冲池中,这个过程叫将页FIX在缓冲池中。下一次再读相同页时,首先判断该页是否在缓冲池中。若在缓冲池中,称该页在缓冲池中命中,直接读取该页。否则,读取磁盘上的页。对于数据库中页的修改操作,首先修改在缓冲池的页,页从缓冲池刷新回磁盘的操作并不是在每次页发生更新时触发,而是通过一种称为checkpoint的机制刷新回磁盘。同样这样是为了提高数据库的整体性能。其缓冲池的配置通过参数innodb_buffer_pool_size来设置。缓冲池中缓存的数据页类型有:索引页、数据页、undo页、插入缓冲(insertbuffer)、自适应哈希索引(adaptivehashindex)、InnoDB存储的锁信息(lockinfo)、数据字典信息(datadictionary)等一个数据库允许有多个缓冲池实例(innodb1.0x开始)。每个页根据哈希值平均分配到冲池实例中。这样做的好处是减少数据库内部的资源竞争,增加数据库的并发处理能力。可以通过参数innodb_buffer_pool_instances来进行配置,默认为1。缓冲池管理:数据库中的缓冲池是通过LRU(LatestRecentUsed,最近最少使用)算法来进行管理的。即最频繁使用的页在lru列表的前端,而最少使用的在lru列表的末端。当缓冲池不能存放新读取的页时,将首先释放lru列表中尾端的页。InnoDB存储引擎中,缓冲池中页的大小默认为16KB,同样使用LRU算法对缓冲池进行管理在InnoDB存储引擎中,LRU列表中加入midpoint位置。新读取到的页,虽然是最新访问的页,但并不是直接放入到LRU列表的首部,而是放到LRUmidpoint的位置,这个算法在innoDB存储引擎下称为Midpointinsertionstrategy。默认配置在lru列表长度的5/8处。在InnoDB存储引擎中,把midpoint之后的列表称为old列表,之前的列表称为new列表。可以简单地理解为new列表中的页都是最为活跃的热点数据。InnoDB存储引擎引入了另一个参数来进一步管理LRU列表,这个参数是innodb_old_blocks_time,用于表示页读取到mid位置后需要等待多久才会被加入到LRU列表的热端当页从LRU列表中的old部分加入到new部分时,成为pagemadeyoung而因为innodb_old_blocks_time的设置而导致页没有从old部分移到new部分的操作为pagenotmadeyounginnodb引擎自1.0之后开始支持压缩页的功能,即原本16kb的页压缩成1kb,2kb,4kb,8kb。对于非16KB的页通过unzip_LRU列表来进行管理。在LRU列表中的页被修改后,称该页为脏页,即缓冲池中的页和磁盘上的页数据产生了不一致。这时数据库通过checkpoint机制讲脏页刷新回磁盘,而flush列表中的页即为脏页列表。脏页既存在于LRU列表中,也存在与FLUSH列表中。LRU列表时用来管理缓冲池中页的可用性,FLUSH列表用来管理将页刷新回磁盘,二者互不影响。缓冲池利用率:这里还有一个重要的观察变量——Bufferpoolhitrate,表示缓冲池的命中率,这个例子中为%,说明缓冲池运行状态非常良好。通常该值不应该小于95%。若发生Bufferpoolhitrate的值小于95%这种情况,用户需要观察是否是由于全表扫描引起的LRU列表被污染的问题。还可以通过表INNODB_BUFFER_PAGE_LRU来观察每个LRU列表中每个页的具体信息InnoDB存储引擎从1.0.x版本开始支持压缩页的功能,即将原本16KB的页压缩为1KB、2KB、4KB和8KB重组日志缓冲(redologbuffer)innodb的内存区除了缓冲池外,还有重做日志缓冲(redologbuffer)。innodb首先将重做日志放入到这个缓冲区,然后按一定过得频率将其刷新到重做日志文件。重做日志缓冲一般不需要很大,一般每秒钟会将缓冲刷新到日志文件。缓冲大小通过innodb_log_buffer_size控制,默认为8MB。为了避免数据库宕机时数据丢失的问题,当前数据库系统普遍采用writeaheadlog策略,即当事务提交时,先写重写日志,再修改页。当由于发生宕机而导致数据丢失师,可以通过重做日志来完成数据的修改。这也是ACID中的D(持久性)的要求。缓冲池刷新到日志文件的三种情况:masterthread每一秒将重做日志缓冲刷新到重做日志文件每个事务提交时会将日志缓冲刷新到重做日志文件当重做日志缓冲剩余空间小于1/2时在innodb存储引擎中,对内存的管理是通过一种称为内存堆(heap)的方式进行的,当该区域的内存不够时,会从缓冲池中进行个申请。-------powergeek(loveandshare)
转载请注明:http://www.aierlanlan.com/tzrz/6614.html