主要内容:

  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. 【linux基础】Ubuntu16.04桌面突然卡住怎么办?

    使用Ctrl+Alt+F1先进入命令行模式,然后根据问题进行相应的操作. re 1. Ubuntu16.04桌面突然卡住怎么办; 2. Ubuntu下图形界面卡死解决办法; end

  2. 【环境搭建与软件安装】How to install CUDNN or uninstall

    前言 CuDnn是用于深度学习的GPU加速库,安装好NVIDIA和CUDA之后,安装CuDnn就简单多了,可参考官方文档. 操作过程 1. 下载cuDnn. 需要在NVIDIA官网注册账号,登录之后下 ...

  3. [LeetCode] 369. Plus One Linked List 链表加一运算

    Given a non-negative number represented as a singly linked list of digits, plus one to the number. T ...

  4. GitLab - 一些基础使用

    1 - GitLab角色权限 1.1 组(同一组成员的行为权限) 管理员创建不同的分组,然后设定分组的负责人(Owner) Owner可以添加组员,为组创建项目,指定项目的负责人 项目负责人可以添加项 ...

  5. 分布式唯一ID生成常用方案

    1. 使用JAVA的UUID生成 算法的核心思想是结合机器的网卡.当地时间.一个随记数来生成UUID. 优点:本地生成,生成简单,性能好,没有高可用风险 缺点:长度过长,字母和数字组合,存储冗余,且无 ...

  6. QT笔记--事件处理

    1 事件是什么 这里的事件主要是用户输入事件,比如点击一个按钮,选中复选框等.当事件发生的时候,达到我们满意的效果. 2信号与槽 connect(A,XX,B,YY) 当A事件发生的时候,B中的处理函 ...

  7. (CSDN迁移)js中的判空

    <c:if test="${something.something == NaN}">style="display: none;"</c:if ...

  8. 给通过canvas生成的二维码添加logo

    以jquery.qrcode为例来说, 生成二维码代码: 依赖jquery.js, jquery.qrcode.js //计算宽,高,中心坐标,logo大小 var width = 256,heigh ...

  9. 八、spring生命周期之BeanPostProcessor

    BeanPostProcessor我们一般称为Bean的后置处理器,它与我们前面介绍的InitialingBean.init-method等一样,都是在bean的初始化时被调用,具体的用法我们在举例中 ...

  10. 2019年广东外语外贸大学程序设计竞赛(新手赛)-F题(好快的刀)题解

    题面: 题目意为,任意连接两个圆的圆心形成一条直线,计算与该直线相交或相切的圆的数量,求这些直线最多能相交或相切多少个圆 解题思路: 遍历所有的圆,计算出两圆圆心生成的直线,再遍历其他的圆,检测这些圆 ...