精华内容
下载资源
问答
  • InnoDB存储引擎

    2018-03-20 20:49:26
    InnoDB存储引擎 InnoDB存储引擎概述 InnoDB存储引擎从MySQL5.5版本开始是默认的存储引擎(之前的版本InnoDB存储引擎仅在Windows下是默认的存储引擎),该存储引擎是第一个完整支持ACID事务的MySQL存储引擎,其...

    InnoDB存储引擎

    InnoDB存储引擎概述

    InnoDB存储引擎从MySQL5.5版本开始是默认的存储引擎(之前的版本InnoDB存储引擎仅在Windows下是默认的存储引擎),该存储引擎是第一个完整支持ACID事务的MySQL存储引擎,其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读、同时被设计用来最有效的利用以及使用内存和CPU。

    InnoDB存储引擎的版本

    InnoDB各版本功能对比
    从MySQL5.1版本开始,MySQL数据库允许存储引擎开发商以动态方式加载引擎,这样存储引擎的更新可以不受MySQL数据库版本的限制。所以在MySQL5.1版本中,可以支持两个版本的InnoDB,一个是静态编译的InnoDB版本,另一个是动态加载的InnoDB版本。MySQL5.5版本中将InnoDB的版本升级到了1.1.x,而在最近的MySQL5.6版本中InnoDB的版本也随着升级为1.2.x版本。

    InnoDB体系架构

    InnoDB存储引擎有多个内存块,可以认为这些内存块组成了一个大的内存池,负责维护所有进程/线程需要访问的多个内部数据结构;缓存磁盘上的数据,方便快速的读取,同时在对磁盘文件的数据修改之前在这里缓存;重做日志缓存等等。
    InnoDB存储引擎架构
    后台线程的主要作用是负责刷新内存池中的数据,保证缓存池中的内存缓存的是最近的数据;此外将已修改的数据文件刷新到磁盘文件,同时保证在数据库发生异常的情况下InnoDB能恢复到正常运行状态。

    后台线程

    InnoDB存储引擎是多线程模型,因此其后台有多个不同的后台线程,负责处理不同的任务:

    Master Thread

    Master Thread是一个非常核心的后台线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性。

    IO Thread

    InnoDB存储引擎中大量使用了Async IO来处理写IO请求,这样可以极大提高数据库的性能,而IO Thread的主要工作是负责这些IO请求的回调处理,可以使用show engine innodb status命令查看InnoDB存储引擎中的IO进程:

    mysql> show engine innodb status\g;
    I/O thread 0 state: waiting for i/o request (insert buffer thread)
    I/O thread 1 state: waiting for i/o request (log thread)
    I/O thread 2 state: waiting for i/o request (read thread)
    I/O thread 3 state: waiting for i/o request (read thread)
    I/O thread 4 state: waiting for i/o request (read thread)
    I/O thread 5 state: waiting for i/o request (read thread)
    I/O thread 6 state: waiting for i/o request (write thread)
    I/O thread 7 state: waiting for i/o request (write thread)
    I/O thread 8 state: waiting for i/o request (write thread)
    I/O thread 9 state: waiting for i/o request (write thread)
    Pending normal aio reads: [0, 0, 0, 0] , aio writes: [0, 0, 0, 0] ,
    ibuf aio reads:, log i/o’s:, sync i/o’s:
    Pending flushes (fsync) log: 0; buffer pool: 0
    451 OS file reads, 54 OS file writes, 7 OS fsyncs
    3.77 reads/s, 16384 avg bytes/read, 1.05 writes/s, 0.13 fsyncs/s

    Purge Thread

    事务被提交后,其所使用的undolog可能不再需要,因此需要PurgeThread来回收已经使用并分配的undo页。从InnoDB1.1版本开始,purge操作可以独立到单独的线程中进行,以此来减轻Master Thread的工作,从而提高CPU的使用率、提升存储引擎的性能。可以通过在MySQL数据库的配置文件中添加相关的命令来启用独立的Purge Thread,略去不表。

    Page Cleaner Thread

    Page Cleaner Thread是在InnoDB 1.2.x版本中引入的,其作用是将之前版本中的脏页的刷新操作都放入到单独的进程中来完成,目的就是为了减轻原Master Thread的工作及对于用户查询线程的阻塞,进一步提高InnoDB存储引擎的性能。

    内存

    缓冲池

    InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理,因此可以将其视为基于磁盘的数据库系统。由于CPU速度与磁盘速度之间的鸿沟,基于磁盘的数据库系统通常会使用缓冲池技术来提高数据库的整体性能。缓冲池简单来说就是一块内存区域,通过内存的速度来弥补磁盘速度较慢对数据库性能的影响。在数据库进行读取页的操作,首先将从磁盘读到的页存放在缓冲池中,这个过程称为将页“FIX”在缓冲池中。下一次再读相同页时,首先判断该页是否存在于缓冲池中。若在则称该页在缓冲池中被命中,直接读取该页,否则,读取磁盘上的页。对于数据库中页的修改操作,首先修改在缓冲池中的页,然后再以一定的频率刷新到磁盘上,需要注意的是,页从缓冲池刷新回磁盘的操作并不是在每次页发生更改时触发,而是通过一种称为CheckPoint的机制刷新回磁盘,这样是为了数据库的整体性能。

    LRU List、Free List和Flush List

    通常来说,数据库中的缓冲池是通过LRU(Latest Recent Used,最近最少使用)算法来进行管理的,即最频繁使用的页在LRU列表的最前端,而最少使用的页在LRU列表的尾端。当缓冲池不能存放新读取到的页时,将首先释放LRU列表尾端的页。各项参数的配置此处略去。

    Checkpoint技术

    缓冲池设计的目的是为了协调CPU速度与磁盘速度的鸿沟,因此页的操作首先都是在缓冲池中完成的。如果一条DML语句改变了页中的记录,那么此时页是脏的,即缓冲池中的页的版本要比磁盘的新,数据库需要将新版本的页从缓冲池刷新到磁盘。尚若每次一个页发生变化,就将新页的版本刷新到磁盘,那么这个开销是非常巨大的,若热点数据集中在某几个页中,那么数据库的性能将变得非常差;同时,如果在从缓冲池将页的新版本刷新到磁盘的过程中发生宕机,那么数据就不能恢复。为了避免数据丢失的问题,当前事务数据库系统普遍都采用了Write Ahread Log策略,通过重做日志来完成完成数据的恢复,这也是事务ACID中的Durability的要求。
    CheckPoint技术的目的是解决以下的几个问题:

    • 缩短数据库的恢复时间
    • 缓冲池不够用时,将脏读刷新到磁盘
    • 重做日志不可用时,刷新脏页
    展开全文
  • InnoDB 存储引擎

    2019-12-16 23:16:18
    接下来 详细介绍 InnoDB 存储引擎的 体系架构 及其不同于其他存储引擎的特性 一 概述 InnoDB 存储引擎 是第一个完整支持ACID事物的 MySQL 存储引擎 特点: 1 行锁设计 2 支持MVCC 3 提供一致性非锁定读 4 最...

    设计上采用了类似于Oracle数据库的架构

    接下来 详细介绍 InnoDB 存储引擎的 体系架构 及其不同于其他存储引擎的特性

    一 概述

    InnoDB 存储引擎 是第一个完整支持ACID事物的  MySQL 存储引擎

    特点: 1 行锁设计

             2 支持MVCC

             3 提供一致性非锁定读

              4 最有效地利用 以及 使用内存和CPU,内存 体现在鲁棒性LRU、写先写缓存 再刷日志 再写磁盘 CPU?

     

    二MySQL 存储引擎的版本:

    版本 功能
    old InnoDB 支持四种隔离级别ACID、行锁、MVCC
    1.0.X 继承上一版本功能,增加了compress 以及 dynamic 页格式
    1.1.X 继承上一版本功能,增加了Linux AIO、多回滚段
    1.2.X 继承上一版本功能,增加全文索引支持、在线索引添加

    三InnoDB 体系架构

    上图位InnoDB存储引擎体系架构,InnoDB 存储引擎有多个内存块,组成了一个大的内存池,提供了以下能力:

    1 维护 所有进程/线程 需要访问的 多个内部数据结构

    2 缓存 磁盘上的数据,方便快速读取,在对磁盘文件数据进行修改之前先更新缓存

    3 重做日志 redo log 缓冲

     

    后台线程作用:

    1 刷新内存池中的数据,确保内存中缓存的 是最近的数据

    2 将已经修改的数据文件 刷新到磁盘文件

    3 确保数据库在发生异常情况下 能恢复到正常运行状态

    展开全文
  • innodb存储引擎

    2012-02-06 09:54:09
    mysql性能优化 Innodb存储引擎
  • Innodb存储引擎

    2017-07-17 17:26:52
    Innodb存储引擎的特点: 行锁设计, 支持MVCC(多版本并发控制), 支持外键, 提供一致性非锁定读, 同时被设计用来最有效地利用以及使用内存和cpu.

    Innodb存储引擎的特点: 行锁设计, 支持MVCC(多版本并发控制), 支持外键, 提供一致性非锁定读, 同时被设计用来最有效地利用以及使用内存和cpu.

    展开全文
  • innodb 存储引擎

    2015-06-24 16:01:40
    以前对于各种引擎也稍微有点理解,可是却并没有深入研究过,最近打算看看Innodb引擎, InnoDB 存储引擎 前言: 数据库:物理操作系统文件...1、默认的InnoDB存储引擎的后台线程有7个,4个IO thread ,1个master th
    以前对于各种引擎也稍微有点理解,可是却并没有深入研究过,最近打算看看Innodb引擎,
    
     InnoDB 存储引擎
    
    前言:
    
    数据库:物理操作系统文件或其他形式文件类型的集合,
    
    数据库实例:有数据库后台进程/线程以及一个共享内存区组成
    
    mysql被设计成了一个单进程多线程架构的数据库
    
    开始:
    
    1、默认的InnoDB存储引擎的后台线程有7个,4个IO thread ,1个master thread 1个锁监控 thread 1个错误监控thread,IO thread 的数量由配置文件的innodb_file_io_threads参数控制,默认是4,linux下面不可以调整,但是window下面可以
    
    show engine innodb status \G;(root用户,或者你的用户有查看权限)
    
    show variables like 'innodb_version' \G;
    
    show variables like 'innodb_%io_threads' \G;
    
    注释:我十分建议大家安装独立的mysql,不要用集成环境,因为出现问题会后悔死的
    
    2、innodb存储引擎内存有以下部分:
    
    buffer pool  缓冲池
    redo log buffer  重做日志缓冲池
    additional memory pool 额外内存池
    
    配置文件的innodb:
    # Comment the following if you are using InnoDB tables
    #skip-innodb
    innodb_data_home_dir = "D:/xampp/mysql/data"
    innodb_data_file_path = ibdata1:10M:autoextend
    innodb_log_group_home_dir = "D:/xampp/mysql/data"
    #innodb_log_arch_dir = "D:/xampp/mysql/data"
    ## You can set .._buffer_pool_size up to 50 - 80 %
    ## of RAM but beware of setting memory usage too high
    innodb_buffer_pool_size = 16M
    innodb_additional_mem_pool_size = 2M
    ## Set .._log_file_size to 25 % of buffer pool size
    innodb_log_file_size = 5M
    innodb_log_buffer_size = 8M
    innodb_flush_log_at_trx_commit = 1
    innodb_lock_wait_timeout = 50

    这是my.ini的配置,更多的InnoDB的配置,可以看my_innodb_heavy_4G.ini
    注释:配置文件的值可能会根据不同的环境更改,上面的配置文件是在我安装之后默认的 3、缓冲池是用来存放各种数据的缓存,InnoDB存储引擎的工作方式是将数据库文件按页(每页16K)读取到缓冲池,然后按照最近最少使用(LRU)的算法保留在缓冲池中的缓存数据 输入:show engine innodb status\G; 显示:
    复制代码
    Dictionary memory allocated 22124
    Buffer pool size   1024  //表示有多少缓冲帧 buffer frame 每个buffer frame 16k
    Free buffers       876   //当前空闲的 buffer frame
    Database pages     147   //已经使用的 buffer frame
    Old database pages 0
    Modified db pages  0     //表示脏页的数量
    Pending reads 0
    Pending writes: LRU 0, flush list 0, single page 0
    Pages made young 0, not young 0
    0.00 youngs/s, 0.00 non-youngs/s
    Pages read 144, created 3, written 37
    0.00 reads/s, 0.00 creates/s, 0.00 writes/s
    No buffer pool page gets since the last printout
    Pages read ahead 0.00/s, evicted without access 0.00/s, Random read ahead 0.
    复制代码
    
    

     

    
    
    注释:show engine innodb status 的命令显示的不是当前的状态,而是过去某个范围内的InnoDB存储引擎的状态
    
    
    4、buffer pool里面的缓存的数据页类型有:
    索引页
    数据页
    undo页
    插入缓冲 insert buffer
    自适应哈希索引 adaptive hash index
    InnoDB存储的锁信息 lock info
    数据字典信息 data dictionary (DD)
    and so on;
    
    5、在32位win下,参数innodb_buffer_pool_awe_mem_mb,可以启动地址窗口扩展(AWE)功能,突破32位下对内存使用的限制,但是一旦启动了AWE,InnoDB存储引擎将自动禁用adaptive hash index
    
    6、日志缓冲将重做日志信息先放入这个缓冲区,然后按照一定的平率将其刷新到重做日志文件,不需要设置很大,保证每秒的产生事务量在这个缓冲大小即可
    
    7、额外的内存池, 在Innodb存储引擎中,对内存的管理师通过一种被称为内存堆(heap)的方式进行的,对一些数据结构本身分配内存时,需要先从额外的内存池中申请,当内存不够时,才会从缓冲池中申请,
    
    innoDB的instance 会申请innodb_buffer_bool的space,
    但是每个buffer pool 中的frame buffer(帧缓冲)还有对应的缓冲控制对象,buffer control block 因此当你的buffer pool足够大的时候,额外内存池也应该增大
    复制代码

     

     

     

    adaptive hash index :默认是开启的,哈希索引只能用来搜索等值的查询.对于其他查找类型,如范围查找,是不能使用的.

    注释:我的数据时模拟的百万级数据,但是我还是没有捕捉到adaptive hash index 的有关应用

     

    复制代码
    二、master Thread 源码分析:
    
    1、master thread n内部组成:
    主循环(loop) 
    后台循环(background loop)
    刷新循环(flush loop)
    暂停循环(suspend loop)
    
    master thread会在这几个状态中切换,在负载很大的时候可能造成延迟delay,
    
    每秒一次的操作包括:
    
    日志缓冲刷新到磁盘,即使这个事务还没有提交(总是)
    
    合并插入缓冲(Maybe)
    
    至多刷新100个Innodb的缓冲池中的脏页到磁盘(Maybe)
    
    如果当前用户没有活动,则切换到background loop(Maybe)
    
    脏页比例: buf_get_modified_ratio_pct 是否超过了innodb_max_dirty_pages_pct这个参数,默认是90(90%) 如果超过了这个阀值,InnoDB认为需要做磁盘同步操作,将100脏页写入磁盘
    
    full purge :删除无用的Undo页
    
    在full purge 的过程中,先判断当前事务系统中已被删除的行是否可以删除,如果可以,会即可删除,
    
    full purge 的时候,每次最多删除20个Undo页
    
    1_second :loop sleeps:睡眠 background:background loop flush:flush loop; InnoDB会对其内部进行一些优化,当压力大时并不是总是等待1秒钟,因为我们不可以认为1_seconds 和sleeps相同 某些情况下,二者只差可以被看做是数据库的负载压力 InnoDB的关键特性: 插入缓冲(insert buffer)
    //和data page 一样,是物理页的一个组成部分 两次写(double write) 自适应哈希索引(adaptive hash index) InnoDB的主键建立聚集(聚簇)索引,如果你的表不需要特殊的聚簇索引,一个好的做法就是使用代理主键(surrogate key)。 如果你的表没有主键,如果你的表里面存在not null并且 unique index,那么innodb就会选择该索引作为主键,否则就自己内建一个类似的rowid的列,6个字节的隐形字段 show table status from dbName;//查看数据库表的info

    innodb_force_recovery :1-6;

    1:SRV_FORCE_IGNORE_CORRUPT :忽略检查到corrupt页
    2:SRV_FORCE_NO_BACKGROUND:阻止主线程的运行,如主线程需要full purge 操作,会导致crash
    3:SRV_FORCE_NO_TRX_UNDO:不执行事务回滚操作
    4:SRV_FORCE_NO_IBUF_MERAGE:不执行插入缓冲的合并操作
    5:SRV_FORCE_NO_UNDO_LOG_SCAN:不查看撤销日志(undo log),Innodb存储引擎会将未提交的事务视为已提交
    6:SRV_FORCE_NO_LOG_REDO:不执行前滚操作

    if(innodb_force_recovery ){
        you can do select ,create ,drop for table;
    }

    show variables like 'innodb_version'\G;查看innodb的varsion info



    复制代码
    展开全文
  • Innodb 存储引擎

    2015-08-02 21:13:00
    一块innodb内存池+多个后台线程,管理着innodb存储引擎。 1. 后台线程 10个IO线程 1个master thread 1个lock监控线程 1个错误监控线程 IO线程相关配置参数 innodb_file_io_threads innodb_read_io_threads...
  • 1、InnoDB存储引擎概述从MySQL5.5.8版本开始是默认的表存储引擎,该存储引擎是第一个完整支持ACID事务的MySQL存储引擎,其特点是行锁设计、支持MVCC、支持外键、提供一致性非锁定读,同时被设计用来最有效地利用以及...
  • //查看innodb存储引擎状态 mysql> show variables like 'innodb_version';//查看innodb存储引擎版本 mysql> show variables like 'innodb_%io_threads';//查看innodb存储引擎io_thread参数 inn...
  • innoDB 存储引擎

    2016-10-07 16:00:00
    innodb 是在mysql 5.5.8 及之后的版本中成为mysql的默认存储引擎。之前都使用myisam。 innodb 是事务型的存储引擎 支持ACID事务,适用于小事务。 1.表空间类型 使用表空间进行数据存储。 通过参数 innodb_file_per_...
  • 2.1 InnoDB存储引擎概述 InnoDB存储引擎最早由Innobase Oy公司开发,被包括在MySQL数据库所有的二进制发行版本中,从MySQL 5.5版本开始是默认的表存储引擎(之前的版本InnoDB存储引擎仅在Windows下为默认的存储引擎...
  • 2.1InnoDB存储引擎概述InnoDB存储引擎是第一个完整支持ACID事务的Mysql存储引擎,行锁设计,支持MVCC,提供一致性非锁定读,支持外键,被设计用来最有效利用内存和CPU。2.2InnoDB体系架构InnoDB存储引擎具备一个大...
  • 2.2InnoDB存储引擎的版本 InnoDB各版本功能对比 版本 功能 老版本InnoDB(mysql5.1静态编译的InnoDB版本) 支持ACID,行锁设计,MVCC InnoDB 1.0.x (mysql5.1动态编译的InnoDB版本,官方称InnoDB ...
  • 第2章 InnoDB存储引擎 InnoDB是事务安全的MySQL存储引擎,设计上采用了类似于Oracle数据库的架构。通常来说,InnoDB存储引擎是OLTP应用中核心表的首选存储引擎。同时,也正是因为InnoDB的存在,才使MySQL数据库变得...
  • 虽然 MySQL 支持种类繁多的存储引擎,但最常用的当属 InnoDB 了,本篇文章将主要介绍 InnoDB 存储引擎相关知识。 1. InnoDB 简介 MySQL 5.5 版本以后,默认存储引擎就是 InnoDB 了。InnoDB 是一种兼顾了高可靠性和...
  • 本文主要内容:InnoDB体系架构CheckPoint技术InnoDB关键特性下图简单描述了InnoDB存储引擎的体系结构:InnoDB后台有多个不同的线程,用来负责不同的任务。主要有如下:MasterThread这是最核心的一个线程,主要负责将...
  • 3.6 InnoDB存储引擎文件 之前介绍的文件都是MySQL数据库本身的文件,和存储引擎无关。除了这些文件外,每个表存储引擎还有其自己独有的文件。本节将具体介绍与InnoDB存储引擎密切相关的文件,这些文件包括重做日志...
  • InnoDB存储引擎中的各种锁

    千次阅读 多人点赞 2020-07-15 23:23:48
    InnoDB存储引擎区别于MyISAM的两个重要特征就是:InnoDB存储引擎支持事务和行级别的锁,MyISAM只支持表级别的锁 InnoDB存储引擎中的锁 InnoDB存储引擎实现了如下两种标准的行级锁: 共享锁(S Lock),允许事务读一...
  • 一、InnoDB存储引擎概述 从MySQL5.5版本开始是默认的表存储引擎,该存储引擎是第一个完整支持ACID事务的MySQL存储引擎,其特点是行锁设计、支持MVCC、支持外键 、提供一致性非锁定读,同事被设计用来最有效地利用...
  • 2.2 InnoDB存储引擎的版本 InnoDB存储引擎被包含于所有MySQL数据库的二进制发行版本中。早期其版本随着MySQL数据库的更新而更新。从MySQL 5.1版本时,MySQL数据库允许存储引擎开发商以动态方式加载引擎,这样存储...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,465
精华内容 7,786
关键字:

innodb存储引擎