乐趣区

关于mysql:Mysql索引数据结构引擎篇

Mysql 能够说是最宽泛应用的数据库之一了,体积小,成本低,开源(收费才是王道呀 -。-),本文旨在和大家一起摸索 Mysql 的一些相干常识,不仅要会用它来写 sql,更要学习它的底层设计和技术延长。

索引数据结构

Mysql 索引是基于 B+tree 的数据结构来设计的,那么为什么不应用二叉树,Hash(其实是反对的),B-tree 等构造来设计索引呢?

二叉树:

树的层数过高,容易进化成链表

均衡二叉树,红黑树:

层数依然过高,会大大增加零碎的 IO 频率

Hash

Mysql 是反对 Hash 索引的,只不过 Hash 索引不反对范畴查找,而咱们在日常工作中须要宽泛的使用到范畴查问

B-tree:

1. 在 B -tree 和 B +tree 中,每一个节点叫做一个磁盘页,每一个磁盘页的大小是 16K,那么相比拟于 B -tree 是在每个节点上都存储数据,B+tree 是只在叶子节点上存储数据,雷同层数下,B+tree 能存储的数据量要大于 B -tree
2.B+tree 的叶子节点有双向指针,对于范畴查找的效率能大大晋升

存储引擎

Mysql 中有很多种存储引擎,咱们这里次要介绍的是 MyISAMInnoDB

关上不同引擎的表的存储文件夹,会发现这两种引擎用来保留相干数据的文件不同:
MyISAM

.frm 文件:存储表构造
.MYD 文件:存储数据
.MYI 文件:存储索引
查问时,如果有索引,在 MYI 文件中依据索引获取数据地址,再去 MYD 文件中查找到数据

InnoDB

.frm 文件: 存储表构造
.ibd 文件:存储索引和数据
索引和数据都存储在 ibd 文件


除了存储文件上的区别,MyISAM 和 InnoDB 还有以下的区别:

  • 前者是非汇集索引,后者是汇集索引
  • 前者不反对事务,后者反对
  • 前者不反对外键,后者反对
  • 前者只反对表锁,后者反对表锁和行锁
  • 前者保留表的行数,后者每次仅限 count(*)操作须要去扫描全表
  • delete 表的时候,前者是从新建表,后者是一行行的删
    ···

那么,什么时候应用哪个最好呢?一般来说,零碎业务波及到查问占大部分,对事务需要度低,容忍度高的,能够应用 MyISAM 引擎,MyISAM 查问效率要高于 InnoDB。反之,零碎波及并发量大,须要大量的增删改操作,倡议应用 InnoDB 引擎。

tips:MyISAM 查问效率更高,是因为:InnoDB 要缓存数据块,而 MyISAM 只有缓存索引块;在 select 的时候 InnoDB 须要去保护 MVCC(多版本并发管制);InnoDB 查问须要映射到块再到行,而 MyISAM 间接记录文件的 offset,定位更快

汇集索引和非汇集索引

  • 对于主键索引和非主键索引来说,MyISAM 节点的主键索引和非主键索引都寄存的是行数据的磁盘地址 InnoDB 非主键索引存储的是主键值,而主键索引里存储的是行数据,当进行非主键索引查问时,先在非主键索引中查找到对应的主键值,而后依据主键值再去主键索引里进行一次树查问,获取主键索引中存储的行数据。(这种第一次树查问定位主键,第二次再进行一次树查问的操作叫做 回表
  • 依据索引存储形式的不同,咱们把 MyISAM 的主键索引和非主键索引类型叫做 非汇集索引 ,把 InnoDB 的主键索引类型叫做 汇集索引 ,非主键索引类型叫做 辅助索引(一般索引)。汇集的含意能够了解为索引和数据聚合在一起。

应用 InnoDB 时的 tips:
1. 基于下面的设计,InnoDB 必须设置主键索引,所以个别倡议咱们在进行表的设计的时候都要增加主键列,如果不设置主键,mysql 会在表中寻找一个惟一列来当做主键索引,如果没有这样的列,它会去保护一个虚构列,用以建设主键索引
2. 主键尽可能的要设置成自增整型类型,因为最终在 B +tree 中是须要去比拟索引大小的,如果是非整型的,或者是无序的主键,还须要先去进行值转换,无疑减少了额定工夫开销

退出移动版