主要内容:

  1. 存储结构
  2. 索引
  3. 事务

存储结构

    • 索引组织表:表是根据主键顺序组织存放的。如果表中没有非空惟一索引,引擎会自动创建一个6字节大小的指针。
    • 主键的索引是定义索引的顺序,而不是建表时列的顺序。
    • 表空间:逻辑结构的最高层,所有的数据都存放在表空间中。
    • 段:表空间由各个段组成,常见的段有数据段、索引段、回滚段等。
    • 数据即索引 ,索引即数据。
    • 区:区是由连续页组成的空间,在任何情况下每个区的大小都为1MB。
    • 引擎页的大小为16KB,即一个区中一共有64个连续的页。
    • 页(也叫块):是InnoDB磁盘管理的最小单位。默认每个页的大小为16KB.新版本中可以设置为4,8,16k。
    • 行:数据是按行存储。每个页最多允许存放7992行记录。
  1. 行记录格式
    • Compact行记录是在MySQL5.0中引入。一个页中存放的数据越多,其性能就越高。
    • 变长字段的长度不能超过2字节,因为VARCHAR类型的最大长度为65535。
    • 行溢出数据:一般认为,BLOB、LOB这类的大对象列类型的存储会把数据存放在数据页面之外。
    • 通过实际测试发现能存放VARCHAR类型的最大长度为65532.
    • MySQL官方手册中定义的65535长度是指所有VARCHAR列的长度总和,如果列的长度总和超过这个长度,依然无法创建
    • VARCHAR(N),CHAR(N) N是指字符的长度,不是字节的长度。
  2. 页结构
    • B+树索引本身并不能找到具体的一条记录,能找到的只是该记录所在的页。
    • 约束和索引的区别:结束是一个逻辑的概念,用来保证数据的完整性,而索引是一个数据结构,既有逻辑上的概念,在数据库中还代表着物流存储的方式。

索引

  1. B+树中的B代表的是balance(平衡),而不是binary(二叉),因为B+树是从最早的平衡二叉树演化而来,但是B+树不是一个二叉树。
  2. 对于某一条具体的记录的查询是通过对Page Directory进行二分查找得到的。
  3. 平衡二叉树的定义如下:首先符合二叉树查找 的定义,其次必须满足任何节点的两个子树的高度最大差为1。
  4. 聚集索引就是按照每张表的主键构造一棵B+树,同时叶子节点中存入的即为整张表的行记录数据,也将聚集索引的叶子节点称为数据页。
  5. 索引组织表中的数据也是索引的一部分。每个数据页都通过一个双向链表来进链接 。
  6. 辅助索引:叶子节点并不包含行记录的全部数据。叶子节点除了包含键值以外,每个叶子节点中的索引 行中还包含了一个书签,用来告诉InnoDB存储引擎哪里可以找到与索引 相对应的行数据。
  7. 当通过辅助索引来查找数据时,InnoDB会遍历辅助索引并通过叶级别指针获得指向主键索引的主键,再通过主键索引 来找到一个完整的行记录。
  8. Microsoft SQL Server 有一种称为堆表的表类型,即行数据的存储按照插入的顺序存放。
  9. Cardinality:表示索引 中惟一值(不重复记录)的数目的估计值。这个值非常关键,优化器会根据这个值来判断是否使用这个索引 。但是这个值不是实时更新的,即并非每次索引的更新都会更新该值,原因是代价过大,所以这个值是一个估计值。 也把这个值称为可选择性。引擎通常通过采样的方式来完成Cardinality的统计。
  10. 覆盖索引:即从辅助索引就可以等到查询的记录,不需要查询聚集索引中的记录。

    通常查询索引列或者count值会用覆盖索引

  11. 优化器不使用索引:在范围查找或者JOIN链接操作时,有可能不使用索引 。
  12. 强制使用索引 :FORCE INDEX
  13. 索引提示:USE INDEX
  14. 如果确定指定某个索引来完成查询,那么最可靠的是FORCE INDEX,而不是USE INDEX
  15. Multi-Range Read(MRR):为了减少磁盘的随机访问,并且将随机访问转化为较为顺序的数据访问。具体做法:在查询辅助索引时,首先根据等到的查询结果,按照主键进行的顺序,并按照主键排序的顺序进行书签查找 (explain 会有Using MRR)
  16. Index Condition Pushdown(ICP)优化:优化之前-查询索引,先根据索引来查找 记录,然后再根据where条件来过滤记录。 优化之后-在取出 索引的同时,判断是否可以进行where条件的过滤,即将where的部分过滤操作放在地了存储引擎层。在一些查询条件下,可以大大减少上层SQL层对记录的索取(fetch),从而提高数据库性能。(explain 会有 Using index condition)
  17. 哈希算法:采用链表的方式解决冲突,除法散列。
  18. 自适应哈希索引:是数据库自身创建并使用的,不能对其进行干预。

  1. 锁机制:是数据库系统区别于文件系统的一个关键特性。提供数据的完整性与一致性。
  2. InnoBD存储引擎不需要锁升级,因为一个锁和多个锁的开销是相同的。
  3. InnoDB实现了两种锁:共享锁(S Lock)与排他锁(X Lock)。
  4. 共享锁:允许事务读一行数据。排他锁:允许事务删除或者更新一行数据。X与S都是行锁
  5. InnoDB存储引擎支持意向锁设计比较简练,即意向锁就是表级别的锁。设计目的就是为了在一个事务中提示下一行将被请求的锁类型。分为:意向共享锁(IS Lock,事务想要 获得一张表中某几行的共享锁),意向排他锁(IX Lock事务想要 获得一张表中某几行的排他锁)
  6. 因为InnoDB存储引擎支持的是行级别的锁,所以意向锁不会阻塞除全表扫以外的任何请求。
  7. 一致性非锁定读:通过多版本控制 的方式来读取当前执行时间数据库中行的数据。如果读取的行正在执行DELETE或者UPDATE操作,这里读取操作不会因此等待行上的锁释放。引擎会读取行的一个快照数据。
  8. 一致性锁定读:SELECT ... FOR UPDATE (对读取的行记录加一个X锁)或者 SELECT ... LOCK IN SHARE MODE(对读取的行记录加一个S锁,其它事务可以向被锁的行加S锁,如果加X锁,则会被阻塞)
  9. 行锁3种算法:Record Lock-单个行记录上锁。Gap Lock-间隙锁,锁定一个范围,但不包含记录本身。Next-Key Lock:Gap+Record
  10. Gap Lock:为了阻止多个事务将记录插入到同一范围内,这个导致Phantom Problem(幻读)产生。可以通过:事务隔离级别设置为RC关闭Gap Lock.
  11. Phantom Problem:指在同一事务下,连续执行两次同样的SQL语句,可能导致不同的结果 ,第二次的SQL语句可能会返回之前不存在的行。
  12. 脏页:在缓冲池中已经被修改的页,但是还没有提交刷新到磁盘中。日志都已经写入到重做日志文件中。脏数据 :指事务对缓冲池中的行记录的修改,并且还没有被提交。
  13. 不可重复读:在一个事务内读取一组数据,在这个事务还没有结束时,另外的事务对这组数据 进行了修改并提交了事务,此时,第一个事务再次读取数据,可能和第一次读取的数据 不一致。
  14. 不可重复读与脏读的区别:脏读是读取未提交的数据 ,不可重复读是读取已经提交的数据。
  15. InnoDB不会回滚超时引发的错误异常。但是发现死锁后会回滚。

事务

  1. ACID:原子性(automicity)、一致性(consistency)、隔离性(isolation)、持久性(durability)。
  2. 原子性、一致性、持久性通过数据库的redo log 和undo log来完成。redo log是重做日志,保证事务的原子性和持久性。undo 保证事务的一致性。redo恢复提交事务修改的页操作,undo回滚行记录到某个待定版本。两者记录的内容不同,redo通过是物理操作,记录的是页的物流修改操作。undo是逻辑日志,根据系统自动记录进行记录。
  3. binlog与redo log的不同:binlog是在MySQL数据库的上层产生,不仅针对InnoDB,任何存储引擎对于数据的更改都会产生binlog. binlog是一种逻辑日志,记录的是对应的SQL语句。redo log是物理格式日志,记录的是对每个页的修改。
  4. binlog只在事务提交时一次写入,redo log是不停地写入,与事务提交顺序不同。
  5. undo是逻辑日志,只是将数据库逻辑地恢复到原来的样子。所有修改被取消了,但是数据结构和页本身在回滚之后可能大不一样了。除了回滚,undo的另外一个作用是MVCC,undo log会伴随着redo log产生,因为undo log需要持久化。
  6. 四种隔离级别:READ UNCOMMITTED / READ COMMITTED / REPEATABLE READ /SERIALIZABLE
  7. MySQL总是自动提交的。

MySQL学习总结 (InnoDB)的更多相关文章

  1. Mysql学习笔记-InnoDB深度解析

    前言 我们在上一篇博客聊了Mysql的整体架构分布,连接层.核心层.存储引擎层和文件系统层,其中存储引擎层作为Mysql Server中最重要的一部分,为我们sql交互提供了数据基础支持.存储引擎和文 ...

  2. 【mysql学习】InnoDB数据结构

    原来知道有一些索引失效的条件,最近看了看mysql底层数据结构,明白了为什么会失效 ,记录之.众所周知,常用的mysql数据引擎有两种,今天全是以InnoDB为基础开启探索之旅的,另一种有时间再说吧. ...

  3. MySQL学习笔记之二---引擎介绍MyISAM VS InnoDB

    前言 MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然性能极佳,但却有一 ...

  4. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  5. 我的MYSQL学习心得(四) 数据类型

    我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(五) 运 ...

  6. 我的MYSQL学习心得(八) 插入 更新 删除

    我的MYSQL学习心得(八) 插入 更新 删除 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得( ...

  7. 我的MYSQL学习心得(九) 索引

    我的MYSQL学习心得(九) 索引 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类 ...

  8. 我的MYSQL学习心得(十四) 备份和恢复

    我的MYSQL学习心得(十四) 备份和恢复 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...

  9. 我的MYSQL学习心得(十五) 日志

    我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  10. 我的MYSQL学习心得(十六) 优化

    我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

随机推荐

  1. 有相关性就有因果关系吗,教你玩转孟德尔随机化分析(mendelian randomization )

    流行病学研究常见的分析就是相关性分析了. 相关性分析某种程度上可以为我们提供一些研究思路,比如缺乏元素A与某种癌症相关,那么我们可以通过补充元素A来减少患癌率.这个结论的大前提是缺乏元素A会导致这种癌 ...

  2. EasyNVR摄像机网页H5全平台无插件直播流媒体播放服务二次开发之接口鉴权示例讲解

    背景需求 EasyNVR的使用者应该都清楚的了解到,EasyNVR一个强大的功能就是可以进行全平台的无插件直播.主要原因在于rtsp协议的视频流(默认是需要插件才可以播放的)经由EasyNVR处理可以 ...

  3. [转]npm 遇到 write access的问题怎么办

    ubuntu下使用 npm install -g 可能会遇到这个问题. 链接地址:https://www.jianshu.com/p/31744aa44824

  4. Excel如何输入负数

    一般红字发票很少开,以前都是单独把红字发票摘出来放到一行里,然后加减一下,前段时间有个客户因为普票无法报销,改要了专票,因为是电子发票,无法作废,开了张红字.虽然红字很少开,但是想着百度一下如何在ex ...

  5. 对QT多线程以及事件投递的理解

    1.使用QObject子类的movetothread方法 代替 QThread子类的run 实现多线程. 使用原始QThread对象的start方法启动线程==>连接原始QThread对象的st ...

  6. php xml转array的方法

    php xml转array的方法 <pre><?php $responseXml='<xml><appid>12</appid></xml& ...

  7. java 多个数 组合成不同的组

    public static Stack<Integer> stack = new Stack<Integer>(); private static List<String ...

  8. Word样式教程

    目录 写在前面 样式可以解决什么问题? 本文适合于 快速入门 一切皆样式 样式与格式的关系 如何修改样式 建立新的样式 样式的匹配和更新 根据样式更新所选段落 根据所选段落更新样式 小结 进一步了解 ...

  9. python基础 — Queue 队列

    queue介绍 queue是python中的标准库,俗称队列. 在python中,多个线程之间的数据是共享的,多个线程进行数据交换的时候,不能够保证数据的安全性和一致性,所以当多个线程需要进行数据交换 ...

  10. hdu 1022 Train Problem I【模拟出入栈】

    Train Problem I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)T ...