关于InnoDB的一些认识

一、聚簇索引

  innoDB将表中数据按主键顺序构造成一颗B+树,叶子节点存放着整张表的行记录数据(索引组织表,即叶子节点就是数据页)。因为无法把数据行存在二个不同的地方,因此每张表只能有一个聚集索引(因此也只能有一个PRIMARY KEY)。

二、二级索引

  叶子节点除了包含索引键值外,还包含了聚集索引键值。一张表可以存在多个辅助索引。通过辅助索引查找时,InnoDB通过辅助索引叶子节点的主键值,再通过主键索引找到完整的行。之所以叶子节点中存储的不是"行指针",而是主键值,这样的策略减少了当行移动或者数据页分裂时二级索引的维护工作。

三、插入缓冲

  应用程序的插入行操作通常是按主键递增的顺序插入的,和聚集索引的结构一致,因此插入聚集索引通常都是顺序的,不需要随机读取。但是对于辅助索引,插入和更新操作影响的页并不是顺序的,因此会导致大量的随机I/O操作。

  InnoDB的插入缓存机制解决了以上的问题,它会检查二级索引页是否在缓冲池中,如果在,InnoDB就直接对索引页应用变更。否则,InnoDB在insert buffer中记录变更,并周期性地合并同一索引页上的操作,大大提高了对二级索引执行插入操作的性能。

  Q1:insert buffer 帮我们解决了什么问题?

  举个现实中的例子来做说明,我们去图书馆还书,对应图书馆来说,他是做了insert(增加)操作,管理员在1小时内接受了100本书,这时候他有2种做法把还回来的书归位到书架上
  1)每还回来一本书,根据这本书的编码(书柜区-排-号)把书送回架上
  2)暂时不做归位操作,先放到柜面上,等不忙的时候,再把这些书按照书柜区-排-号先排好,然后一次性归位
  用方法1,管理员需要进出(IO)藏书区100次,不停的登高爬低完成图书归位操作,累死累活,效率很差。
  用方法2,管理员只需要进出(IO)藏书区1次,对同一个位置的书,不管多少,都只要爬一次楼梯,大大减轻了管理员的工作量。

  关系数据库在处理插入操作的时候,处理的方法和上面类似,每一次插入都相当于还一本书,它也需要一个柜台来保存插入的数据,然后分类归档,在不忙的时候做批量的归位。这个柜台就是insert buffer。

  Q2:insert buffer 有什么限制,为什么?

   只对于非聚集索引(非唯一)的插入和更新有效。
  为什么对于非聚集索引(非唯一)的插入和更新有效?
  还是用还书的例子来说,还一本书A到图书馆,管理员要判断一下这本书是不是唯一的,他在柜台上是看不到的,必须爬到指定位置去确认,这个过程其实已经产生了一次IO操作,相当于没有节省任何操作。
  所以这个buffer只能处理非唯一的插入,不要求判断是否唯一。聚集索引就不用说了,它肯定是唯一的,MySQL现在还只能通过主键聚集。

四、二次写

  若说insert buffer带给InnoDB存储引擎的是性能,那么二次写带给带给innoDB存储引擎的是数据的可靠性。当数据库宕机的时候,可能发生在数据库正在写一个页面,而且这个页面只写了一部分的情况,我们称之为部分写失效。在InnoDB存储引擎未使用double write技术前,曾出现过因为部分写失效而导致数据丢失的情况。

  也许有人会说写失效,可以通过重做日志来恢复,但是必须清楚的是,重做日志中记录的是对页的物理操作,如偏移量800,写‘aaaa‘记录。如果这个页本身已经损坏,再对其进行重做是没有意义的。这就是说,在应用重做日志前,我们需要一个页的副本,当写入失效发生时,先通过页的副本来还原该页,再进行重做,这就是doublewrite。

五、自适应索引

  InnoDB存在一个监控索引查找的机制,当发现建立哈希索引可以提升查询效率时,便会自动创建,因此称之为自适应(adaptive)哈希索引。哈希索引的建立基于表上已存在的B+树,并且可只在那些经常访问的索引页上建立。

时间: 2024-10-09 22:12:15

关于InnoDB的一些认识的相关文章

mysql5.7 innodb数据库备份工具Xtrabackup的安装

mysql5.7 innodb数据库备份工具Xtrabackup的安装     wget mhttps://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.7/binary/redhat/6/x86_64/percona-xtrabackup-24-2.4.7-1.el6.x86_64.rpm Mysql5.7需要安装XtraBackup 2.4.1以上版本 官网地址 https://www.percona.com/down

mysql之show engine innodb status解读(转)

add by zhj: 我第一次知道这个命令是线上服务出了问题,然后同事用这个命令去查看死锁.但用这个命令看死锁有一定的局限性,它只能看到最后一次死锁, 而且只能看到死锁环中的两个事务所执行的最后一条语句(即被死锁卡住的那条语句),看不到整个死锁环,也看到不整个事务的语句.但是即使这亲,对我 们来说也非常有用,因为一般来说,数据库同时存在多个死锁环的可能性比较小,而且有了死锁环中的事务的最后一条语句,我们找到整个死锁环不是太难. "show engine innodb status"这

MyISAM与Innodb数据库引擎的区别

1. 存储结构 2. 存储空间 3. 可移植性.备份及恢复 4. 事务支持 5. 自增长 6. 表锁差异 7. 全文索引 8. 表主键 9. 表的具体行数 10. CURD操作 11. 外键 MySQL存储引擎中的MyISAM和InnoDB区别详解

误删除innodb ibdata数据文件-之恢复

今天在群里看到有人说不熟悉innodb把ibdata(数据文件)和ib_logfile(事务日志)文件误删除了.不知道怎么解决.当时我也不知道怎么办.后来查阅相关资料.终找到解决方法.其实恢复也挺简单的.我们不知道的时候就觉得难了.谁说不是这样呢? 下面我们就来模拟生产环境下,人为删除数据文件和重做日志文件.然后详细说明恢复步骤. 1.用sysbench模拟数据的写入,如下所示: [[email protected] ~]# sysbench --test=oltp --oltp-table-s

Innodb存储引擎

特点:支持事务.锁定机制的改进,Innodb改变了MylSAM的锁机制,实现了行锁.实现外键..frm文件来存放结构定义相关的元数据,但是表数据和索引数据是存在一起的,每个表单独存放还是表存放在一起,完全由用户来决定. 理论:Innodb的物理结构分为两大部分 数据文件(表数据和索引数据) 存放表中的数据和所有的索引数据,包括主键和其他普通索引.Innodb中,存在了表空间这样的概念,和oracle的表空间又有较大的不同.Innodb的表空间分为两种形式.一种是共享表空间,就是所有表和索引数据存

MySQL存储引擎MyISAM与InnoDB的优劣

使用MySQL当然会接触到MySQL的存储引擎,在新建数据库和新建数据表的时候都会看到. MySQL默认的存储引擎是MyISAM,其他常用的就是InnoDB了. 至于到底用哪种存储引擎比较好?这个问题是没有定论的,需要根据你的需求和环境来衡量.所以对这两种引擎的概念.原理.异同和各自的优劣点有了详细的了解之后,再根据自己的情况选择起来就容易多了. MyISAM InnoDB 存储结构 每张表被存放在三个文件: frm-表格定义 MYD(MYData)-数据文件 MYI(MYIndex)-索引文件

Innodb后台线程

1.maste thread 负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性. 2.IO Thread负责IO请求的回调处理.1.0版本之前有4个IO Thread,负责write.read.insert buffer和log IO Thread1.0.x开始,read thread和write thread分别增加到4个,不再使用innodb_file_io_threads参数,而是使用innodb_read_io_threads和innodb_write_io_threads mysq

MyISAM 与 InnoDB 区别

构成上的区别: 每个MyISAM在磁盘上存储成三个文件. 第一个文件的名字以表的名字开始,扩展名指出文件类型.  .frm文件存储表定义. 数据文件的扩展名为.MYD (MYData). 索引文件的扩展名是.MYI (MYIndex). 基于磁盘的资源是InnoDB表空间数据文件和它的日志文件,InnoDB 表的大小只受限于操作系统文件的大小,一般为 2GB 事务处理上方面: MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持 InnoDB提供事务支持事务,外

Mysql数据库引擎(MyISAM、InnoDB)

MyISAM.InnoDB区别 nnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定. 基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能.

innodb部分常用参数解析

一.文件(数据文件.日志文件) 1.相关参数: innodb_data_home_dir innodb_data_file_path=file_name:file_size[:autoextend[:max:max_file_size]] 注: a.innodb_data_file_path的值应该为一个或多个 数据文件规格的列表.如果命名一个以上的数据文件,用 分号(';')分隔它们 b.autoextend属性和后面跟着的属性只可被用来对innodb_data_file_path行里最后一个