精华内容
下载资源
问答
  • InnoDB后台有多个不同的线程,用来负责不同的任务。主要有如下: Master Thread 这是最核心的一个线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括赃页的刷新、合并插入缓冲、UNDO 页的回收等....

    InnoDB后台有多个不同的线程,用来负责不同的任务。主要有如下:

    • Master Thread
      这是最核心的一个线程,主要负责将缓冲池中的数据异步刷新到磁盘,保证数据的一致性,包括赃页的刷新、合并插入缓冲、UNDO 页的回收等.
    • IO Thread
      在 InnoDB 存储引擎中大量使用了异步 IO 来处理写 IO 请求, IO Thread 的工作主要是负责这些 IO 请求的回调处理。
    • Purge Thread
      事务被提交之后, undo log 可能不再需要,因此需要 Purge Thread 来回收已经使用并分配的 undo页. InnoDB 支持多个 Purge Thread, 这样做可以加快 undo 页的回收。
    • Page Cleaner Thread
      Page Cleaner Thread 是在InnoDB 1.2.x版本新引入的,其作用是将之前版本中脏页的刷新操作都放入单独的线程中来完成,这样减轻了 Master Thread 的工作及对于用户查询线程的阻塞。

     

    自适应哈希索引

    哈希是一种非常快的查找方法,在一般情况时间复杂度为O(1)。而B+树的查找次数,取决于B+树的高度,在生成环境中,B+树的高度一般为3-4层,不需要查询3-4次。

    InnoDB存储引擎会监控对表上各索引页的查询。如果观察到建立哈希索引可以提升速度,这简历哈希索引,称之为自适应哈希索引(Adaptive Hash Index, AHI)。AHI是通过缓冲池的B+树页构造而来的。因此建立的速度非常快,且不要对整张表构建哈希索引。InnoDB存储引擎会自动根据访问的频率和模式来自动的为某些热点页建立哈希索引。

    AHI有一个要求,对这个页的连续访问模式(查询条件)必须一样的。例如联合索引(a,b)其访问模式可以有以下情况:

    • WHERE a=XXX;

    • WHERE a=xxx AND b=xxx。
      若交替进行上述两张查询,InnoDB存储引擎不会对该页构造AHI。此外AHI还有如下要求:

    • 以该模式访问了100次;

    • 页通过该模式访问了N次,其中N=页中记录/16。
      根据官方文档显示,启用AHI后,读取和写入的速度可以提高2倍,负责索引的链接操作性能可以提高5倍。其设计思想是数据库自由化的,无需DBA对数据库进行人为调整。

    innoDB和mysiam区别:

    1、:InnoDB的主索引的节点与数据放在一起,次索引的节点存放的是主键的位置。

            myisam的主索引和次索引都指向该数据在磁盘的位置。

    展开全文
  • InnoDB Diagrams 是 Google 的 MySQL 专家 Jeremy Cole 在 GitHub 上开的一个项目,提供了很多 InnoDB 原理图。InnoDB Diagrams 的目的是构建完整,易懂的 InnoDB 原理图。这些原理图是基于 innodb_ruby 项目。
  • MySQL Innodb 索引原理详解
  • MySQL InnoDB 索引原理

    2021-01-22 18:15:12
  • Innodb原理

    千次阅读 2018-12-24 10:50:14
    一、Innodb锁 1.1 锁介绍  innodb存储引擎是mysql5.1之后的默认存储引擎,相对于之前的默认存储引擎MyISAM,它有两个不同点:一是支持事物,二是采用了行级锁。下面介绍一下innodb的锁。  共享锁(S):其实就....

    转载请说明出处:https://blog.csdn.net/dhtx_wzgl/article/details/85230083

    一、Innodb锁

    1.1 锁介绍

           innodb存储引擎是mysql5.1之后的默认存储引擎,相对于之前的默认存储引擎MyISAM,它有两个不同点:一是支持事物,二是采用了行级锁。下面介绍一下innodb的锁。

            共享锁(S):其实就是读锁,它允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁(写锁)。当某一事物去读一行记录时,其他的事物也可以读该行,但是不能进行写操作。

            排他锁(X):其实就是写锁,允许获得排他锁的事务更新数据,阻止其他事务取得相同数据集的共享读锁和排他写锁。当一个事物对某一行进行写操作时,其他事物的读写操作全部会被block,直到拿到锁为止。

            意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的意向共享锁。

            意向排他锁(IX):事务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的意向排他锁。

            其中意向锁只能加在比行更粗的粒度上,比如库、表、页等。

     

                                                                                                                                        锁的兼容性

    1.2 锁与事物隔离的关系

             mysql的事物隔离级别是可重复读,可重复读是事物级的。下面通过两个例子来看一下innodb如何通过锁来实现这一隔离级别的:


            例1:假如有三个事物分别为R1、R2、W1,其中R1和R2是读事物,W1为写事物,他们都要对图中的行1进行操作,执行的顺序为R1、R2、W3。根据Innodb锁之间的兼容性可以知道这三个事物对表1和页1和行1的锁获取情况如下:

            首先,R1会获得表1的IS锁、接着获得页1的IS锁,最后拿到行1的S锁;由于R2也是读操作,争取的锁也是共享的,所以会和R1拿到完全一样的锁;而W1是写操作,需要争取排他锁,在表1上已经存在的只是IS锁,所以W1可以获得它的IX锁,同样也可以获得页1的IX锁,但是在行1上已经存在S锁,所以W1只有等待R1和R2都释放掉S锁之后,才能获得行1的X锁。

            结论:在先存在读的情况下,不能进行写操作,避免了读的过程中数据被改写造成不可重复读的情况。

     R1R2W1
    表1ISISIX
    页1ISISIX
    行1SS 

     

     例2:假如有三个事物分别为W1、W2、R1,其中W1和W2是写事物,R1为读事物,他们同样都要对图中的行1进行操作,执行的顺序为W1、W2、R1。根据Innodb锁之间的兼容性可以知道这三个事物对表1和页1和行1的锁获取情况如下:

            首先,W1会获得表1的IX锁、接着获得页1的IX锁,最后拿到行1的X锁;由于W2也是写操作,争取的锁也是排它的,首先在争取表1的IX锁时,发现表1上只存在IX锁,所以获得锁成功,同样可以成功得到页1的IX锁,但是在争取行1的S锁时,发现行1上已经存在了一个X锁,这时只能堵塞直到该锁被释放;对于R1,需要争取共享锁,在表1上已经存在的是IX锁,所以R1可以获得它的IS锁,同样也可以获得页1的IS锁,但是在行1上已经存在X锁,所以R1也要被堵塞直到X锁被释放再去争取S锁。

            结论:在先存在写的情况下,不能同时进行其他的读写操作,避免了读的过程中数据被改写造成不可重复读的情况。

     

     W1W2R1
    表1IXIXIS
    页1IXIXIS
    行1X  

                                                                                                                                                                                       

    1.3 锁升级

            1、行锁只能加在索引上,如果操作不走索引,就会升级为表锁。因为innodb的行锁是加在索引上的,如果不走索引,自然就没法使用行锁了,原因是innodb是将primary key index和相关的行数据共同放在B+树的叶节点;innodb一定会有一个primary key,secondary index查找的时候,也是通过找到对应的primary,再找对应的数据行。
            2、当非唯一索引上记录数超过一定数量时,行锁也会升级为表锁。测试发现当非唯一索引相同的内容不少于整个表记录的二分之一时会升级为表锁,因为当非唯一索引相同的内容达到整个记录的二分之一时,索引需要的性能比全文检索还要大,查询语句优化时会选择不走索引,造成索引失效,行锁自然就会升级为表锁。

    1.4 其他

          1、行排他锁与表排他锁互斥。因为表锁意味着拥有该锁的事物能够对该表中的任何记录做操作,即相当于在任意一行上加了行锁,所以会互斥。

          2、如果字段在where子句中的类型与数据库类型不一致时,执行操作时索引可能会失效。原因是where子句上字段类型和数据库中字段类型不一致,mysql会自动做类型转换,即在左边加一个转换函数,所以会造成索引失效。mysq转换规则如下:

         mysql隐式转换规则:

    序号规则
    1 两个参数至少有一个是 NULL 时,比较的结果也是 NULL,例外是使用 <=> 对两个 NULL 做比较时会返回 1,这两种情况都不需要做类型转换
    2两个参数都是字符串,会按照字符串来比较,不做类型转换
    3两个参数都是整数,按照整数来比较,不做类型转换
    4十六进制的值和非数字做比较时,会被当做二进制串
    5有一个参数是 TIMESTAMP 或 DATETIME,并且另外一个参数是常量,常量会被转换为 timestamp
    6有一个参数是 decimal 类型,如果另外一个参数是 decimal 或者整数,会将整数转换为 decimal 后进行比较,如果另外一个参数是浮点数,则会把 decimal 转换为浮点数进行比较
    7所有其他情况下,两个参数都会被转换为浮点数再进行比较

     

    展开全文
  • InnoDB原理

    2017-12-24 00:34:36
    InnoDB存储引擎既支持行级锁,也支持表级锁,默认情况下采用行级锁。 Mysql3中锁特性如下: 表级锁:开销小,加锁块;不会出现死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁:开销大,加锁慢;会...

    InnoDB存储引擎既支持行级锁,也支持表级锁,默认情况下采用行级锁。
    Mysql3中锁特性如下:
    表级锁:开销小,加锁块;不会出现死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低。
    行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发性也最高。
    页面锁:开销和加锁界于表锁和行锁之间,会出现死锁;锁定粒度界与表锁和行锁之间,并发一般。

    InnoDB实现了两种类型的行锁。

    共享锁(S):允许一个事务去读一行,阻止其他事务获得相同的数据集的排他锁。

    排他锁(X):允许获得排他锁的事务更新数据,但是组织其他事务获得相同数据集的共享锁和排他锁。

    可以这么理解:

    共享锁就是我读的时候,你可以读,但是不能写。排他锁就是我写的时候,你不能读也不能写。其实就是MyISAM的读锁和写锁,但是针对的对象不同了而已。

    除此之外InnoDB还有两个表锁:

    意向共享锁(IS):表示事务准备给数据行加入共享锁,也就是说一个数据行加共享锁前必须先取得该表的IS锁

    意向排他锁(IX):类似上面,表示事务准备给数据行加入排他锁,说明事务在一个数据行加排他锁前必须先取得该表的IX锁。

    意向锁是InnoDB自动加的,不需要用户干预。

    对于insert、update、delete,InnoDB会自动给涉及的数据加排他锁(X);对于一般的Select语句,InnoDB不会加任何锁,事务可以通过以下语句给显示加共享锁或排他锁。

    共享锁:select * from table_name where …..lock in share mode

    排他锁:select * from table_name where …..for update

    在mysql中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql语句操作了主键索引,MySQL就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。

    InnoDB行锁是通过给索引项加锁实现的,如果没有索引,InnoDB会通过隐藏的聚簇索引来对记录加锁。

    也就是说:如果不通过索引条件检索数据,那么InnoDB将对表中所有数据加锁,实际效果跟表锁一样。

    行锁分为三种情形:

    Record lock :对索引项加锁,即锁定一条记录。

    Gap lock:对索引项之间的‘间隙’、对第一条记录前的间隙或最后一条记录后的间隙加锁,即锁定一个范围的记录,不包含记录本身

    Next-key Lock:锁定一个范围的记录并包含记录本身(上面两者的结合)。

    注意:InnoDB默认级别是repeatable-read级别,所以下面说的都是在RR级别中的。

    之前一直搞不懂Gap Lock和Next-key Lock的区别,直到在网上看到一句话豁然开朗,希望对各位有帮助。

    Next-Key Lock是行锁与间隙锁的组合,这样,当InnoDB扫描索引记录的时候,会首先对选中的索引记录加上行锁(Record Lock),再对索引记录两边的间隙加上间隙锁(Gap Lock)。如果一个间隙被事务T1加了锁,其它事务是不能在这个间隙插入记录的。

    小结:
    行锁防止别的事务修改或删除,GAP锁防止别的事务新增,行锁和GAP锁结合形成的的Next-Key锁共同解决了RR级别在写数据时的幻读问题。

    发生死锁后,InnoDB一般都可以检测到,并使一个事务释放锁回退,另一个获取锁完成事务。

    展开全文
  • Mysql InnoDB索引原理

    2018-10-17 21:41:03
    #Mysql InnoDB索引原理 理解Mysql索引的原理和数据结构有助于我们更好的使用索引以及进行SQL优化,索引是在存储引擎层面实现的,所以不同的引擎实现的索引也有一定的区别,但是在生产环境中,我们最常用的就是InnoDB...
  • 了解InnoDB底层原理

    2020-12-19 23:04:22
    存储引擎 存储引擎,我认为就是一种存储解决方案,实现了新增数据、...InnoDB是目前使用最广的MySQL存储引擎,MySQL从5.5版本开始InnoDB就已经是默认的存储引擎了。 InnoDB的内存架构主要分为三大块,缓冲池(B...
  • InnoDB索引原理详解

    2020-10-13 09:49:33
     本篇介绍下Mysql的InnoDB索引相关知识,从各种树到索引原理到存储的细节。  InnoDB是Mysql的默认存储引擎(Mysql5.5.5之前是MyISAM,文档)。本着高效学习的目的,本篇以介绍InnoDB为主,少量涉及MyISAM作为对比。...
  • InnoDB存储原理简介

    2019-09-18 10:20:07
    这篇博文写的通俗易懂,稍后自己再总结一下 https://www.cnblogs.com/rjzheng/p/9915754.html#commentform
  • InnoDB update原理解析

    千次阅读 2018-05-01 14:28:15
  • InnoDB insert原理解析

    千次阅读 2018-04-30 10:58:44
  • InnoDB delete原理解析

    千次阅读 2018-04-30 17:05:20
  • MySQL优化之InnoDB基础原理 一、事务隔离级别 理解各种事务隔离级别的优缺点 (一)四种事务隔离级别总结 (二)四种事务隔离级别下,去重现脏读现象、不可重复读现象、幻读现象 1、在RU隔离级别下,会出现脏...
  • InnoDB search原理解析

    2018-04-29 15:39:29
  • 存储引擎 很多文章都是直接开始介绍有哪些存储引擎,并没有去介绍存储引擎本身。那么究竟什么是存储引擎?不知道大家有没有想过,MySQL是如何存储...种类很多,但是常用的存储引擎目前就只有InnoDB和MyISAM,我也会着
  • 主要给大家介绍了关于MySQL Innodb索引原理的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用mysql具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 9000字详解 MySQL InnoDB 实现原理
  • MySQL InnoDB 引擎现在广为使用,它提供了事务,行锁,日志等一系列特性,本文分析下 InnoDB 的内部实现机制,MySQL 版本为 5.7.24,操作系统为 Debian 9。 1、InnoDB 架构 Innodb 架构图 InnoDB 的架构分为...
  • mysql数据库文件InnoDB 和 MyISAM的区别Innodb隔离级别原理实现InnoDB主备复制 一、MVCC InnoDB是一个多版本存储引擎:它保存关于已更改行的旧版本的信息,以支持诸如并发和回滚之类的事务特性.可以认为MVCC是...
  • MySql InnoDB 内存管理、索引实现、记录存储剖析 笔记。学习的内容会进行不定期更新,欢迎提意见
  • INNODB索引实现原理

    千次阅读 2018-07-19 20:36:29
    本篇继续整理Innodb索引实现原理。本文基于《MySQL运维内参》第8章整理。 二 B+树  B+树属于索引的基础,不在详细介绍插入删除过程。只介绍特点。 1 搜索二叉树:每个节点有两个子节点,数据量的增大必然导致...
  • InnoDB引擎MVCC实现原理
  • MySQL的InnoDB索引原理详解

    千次阅读 2016-07-26 16:48:23
     本篇介绍下Mysql的InnoDB索引相关知识,从各种树到索引原理到存储的细节。  InnoDB是Mysql的默认存储引擎(Mysql5.5.5之前是MyISAM,文档)。本着高效学习的目的,本篇以介绍InnoDB为主,少量涉及MyISAM作为对比...
  • InnoDB实现MVCC原理

    2019-10-05 12:39:05
    ​ MVCC(Multi-Version Concurrent Control),即多版本并发控制,通过保存数据在某个时间点的快照来实现,因此每个读操作都会看到一个一致性的视图,并且可以实现非阻塞...InnoDB实现MVCC原理InnoDB会为每一行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 62,197
精华内容 24,878
关键字:

innodb原理