11月02, 2020

【Mysql知识汇总】之存储引擎和索引模型

写在前边:mysql所涉及的基础知识还是比较多的,什么存储引擎、索引、索引模型、sql优化、范式等等,本节先描述最基础的存储引擎和索引模型

你懂得越多,你不懂的越多

存储引擎

存储模型是对数据库存取数据的一种实现机制,包括为存储数据建立索引,以及查询技术的方式。常用的存储引擎:MyISAM、InnoDB、Memory、Archive

查看方式: show engines; // 查看mysql所支持的存储引擎,以及从中得到mysql默认的存储引擎。

alt

四种存储引擎的比较

InnDB

  • 数据的屋里组织形式是簇表
  • 支持事务
  • 支持自增长列
  • 支持MVCC的行级锁
  • 支持外键
  • 支持热备份
  • 默认使用B+ 树 索引模型
  • 不仅缓存索引,还会缓存数据
  • 优缺点:提供良好的事务处理、容错(崩溃修复能力)、缺点是读取数据效率较差,占用的数据空间相对较大。适用于对事务要求高、并发写入高的场景。

MyISAM

  • 插入数据块,空间内存使用的比较少
  • 不支持事务
  • 不支持表级锁, 只支持行级锁
  • 主机宕机后,数据表容易损坏,容灾性不好
  • 并发性能差,适用于高select的场景
  • 只缓存索引,不缓存数据

Memory:

  • 所有数据存储在内存中,磁盘中存储.frm的表结构文件
  • 默认索引模型是HASH
  • 数据安全性较差,不适用于大表

Archive

  • 适用于数据量大的表,比如历史记录
  • 提供压缩功能
  • 不支持索引

索引模型

HASH(哈希表):

  • 使用某一列的值,通过hash函数计算出的值作为Key,数据记录作为value
  • 不适用范围查询

    alt

B+ tree(B+树)

  • 有m个子树的节点包含有m个元素
  • 根节点和分支节点只保存索引,叶子节点保存数据
  • 每个叶子节点具有相同的深度,即树的高度h
  • 每个叶子节点还有指向下一个节点的指针next,方便遍历整棵B+树

    alt

扩展

B- 树

  • 每个节点最多有m个孩子。
  • 除了根节点和叶子节点外,其它每个节点至少有Ceil(m/2)个孩子。
  • 若根节点不是叶子节点,则至少有2个孩子
  • 所有叶子节点都在同一层,且不包含其它关键字信息
  • 每个非终端节点包含n个关键字信息(P0,P1,…Pn, k1,…kn)
  • 关键字的个数n满足:ceil(m/2)-1 <= n <= m-1
  • ki(i=1,…n)为关键字,且关键字升序排序。
  • Pi(i=1,…n)为指向子树根节点的指针。P(i-1)指向的子树的所有节点关键字均小于ki,但都大于k(i-1)

    alt

Hash、AVL树、B-树、B+树做索引模型区别

  • hash 便于精确查询,但不适用于范围查询
  • AVL树(平衡二叉树):有序,可以实现范围查询,但是如果存储数据太多,树层级很高,查询记录时对应的磁盘IO就会多
  • B- Tree(平衡多路查找树):每个节点存储多个元素,而且树的高度也降低了,大大减少了磁盘IO次数
  • B+ Tree:B+树是B-树的升级版,将非叶子节点冗余,并且叶子节点有指向下一个叶子节点的指针,这样就提高了范围查询效率

个人公众号,目前处于试运营阶段

跪求各位有志之士关注

alt

本文链接:http://blog.keepting.cn/blog//post/mysql_01.html

-- EOF --

Comments