MySQL之InnoDB

一、InnoDB 逻辑存储结构

1.1 物理存储

包括ibd(索引文件和数据文件是同一个文件,都在.ibd 文件里面 )、frm、日志文件 ,每个数据库有一个目录 ,数据目录的地址 :show VARIABLES LIKE 'datadir';  

1.2 MySQL 的存储结构。    

     (1)表空间(Table Space ):所有数据都存在表空间,有系统表空间、独占表空间、通用表空间、临时表空间、Undo 表空间。

      (2) 段 (Segment ),表空间是由各个段组成的,常见的段有数据段、索引段、回滚段等,段是一个逻辑的概念。一个 ibd 文件(独立表空间文件)里面会由很多个段组成。 创建一个索引会创建两个段,一个是索引段:leaf node segment,一个是数据段:non-leaf node segment。索引段管理非叶子节点的数据。数据段管理叶子节点的数据。一个表的段数,就是索引的个数乘以 2。
      (3)簇 (Extent ):一个段(Segment)又由很多的簇(也可以叫区)组成,每个区的大小是 1MB(64个连续的页)。每一个段至少会有一个簇,一个段所管理的空间大小是无限的,可以一直扩展下去,但是扩展的最小单位就是簇。 
      (4)页(page):为了高效管理物理空间,对簇进一步细分,就得到了页。簇是由连续的页(Page)组成的空间,一个簇中有 64 个连续的页。 (1MB/16KB=64)。这些页面在物理上和逻辑上都是连续的。跟大多数数据库一样,InnoDB 也有页的概念(也可以称为块),每个页默认 16KB。页是 InnoDB 存储引擎磁盘管理的最小单位,通过 innodb_page_size 设置。一个表空间最多拥有 2^32 个页,默认情况下一个页的大小为 16KB,也就是说一个表空间最多存储 64TB 的数据 。连续的插入数据时,一个页面已经写完,产生一个新的叶页面。如果一个簇的所有的页面都被用完,会从当前页面所在段新分配一个簇 。 如果数据不是连续的,往已经写满的页中插入数据,会导致叶页面分裂 ,影响性能。
      (5)行(row)数据按照行存储。


1.3 B Tree (多路平衡查找树 )

B 树在枝节点和叶子节点存储键值、数据地址、节点引用 。分叉数(路数)永远比关键字数多 1 。在更新索引的时候会有大量的索引的结构的调整,所以为什么我们不要在频繁更新的列上建索引,或者为什么不要更新主键。节点的分裂和合并,其实就是 InnoDB 页的分裂和合并。 

1.4 B+Tree

    (1)与B Tree不同,关键字的数量是跟路数相等的,它是 B Tree 的变种,B Tree 能解决的问题,它都能解决。B Tree 解决的两大问题是什么?(每个节点存储更多关键字;路数更多) 

    (2)B+Tree 的根节点和枝节点中都不会存储数据,只有叶子节点才存储数据。搜索到关键字不会直接返回,会到最后一层的叶子节点。扫库、扫表能力更强(如果我们要对表进行全表扫描,只需要遍历叶子节点就可以了,不需要遍历整棵 B+Tree 拿到所有的数据) 
    (3)B+Tree 的每个叶子节点增加了一个指向相邻叶子节点的指针,它的最后一个数据会指向下一个叶子节点的第一个数据,形成了一个有序链表的结构。B+Tree 的磁盘读写能力相对于 B Tree 来说更强(根节点和枝节点不保存数据区,所以一个节点可以保存更多的关键字,一次磁盘加载的关键字更多) ,排序能力更强(因为叶子节点上有下一个数据区的指针,数据形成了链表)
    (4) 它是根据左闭右开的区间 [ )来检索数据。
    (5)效率更加稳定(B+Tree 永远是在叶子节点拿到数据,所以 IO 次数是稳定的)

1.5 索引

(1) 列的离散(sàn) 度 第一个叫做列的离散度,我们先来看一下列的离散度的公式:count(distinct(column_name)) : count(*),列的全部不同值和所有数据行的比例。数据行数相同的情况下,分子越大,列的离散度就越高。 列的重复值越多,离散度就越低 
(2)联合索引最左匹配 ,联合索引在 B+Tree 中是复合的数据结构,它是按照从左到右的顺序来建立搜索树的 ,
(3) 回表扫描,非主键索引,我们先通过索引找到主键索引的键值,再通过主键值查出索引里面没有的数据,它比基于主键索引的查询多扫描了一棵索引树,这个过程就叫回表扫描 。
(4)覆盖索引:在辅助索引里面,不管是单列索引还是联合索引,如果 select 的数据列只用从索引中就能够取得,不必从数据区中读取,这时候使用的索引就叫做覆盖索引,这样就避免了回表 



























 

 

 

 

 

 

 

 

 

 

 

唯一索引(Unique):唯一索引要求键值不能重复。另外需要注意的是,主键索引是一种特殊的唯一索引,它还多了一个限制条件,要求键值不能为空。主键索引用 primay key
创建。

普通索引(Normal):也叫非唯一索引,是最普通的索引。

全文索引(Fulltext):针对比较大的数据,比如我们存放的是消息内容,有几 KB 的数
据的这种情况,如果要解决 like 查询效率低的问题,可以创建全文索引。只有文本类型
的字段才可以创建全文索引(varchar、text)。

posted @ 2020-09-04 10:06  没有如果Z  阅读(227)  评论(0编辑  收藏  举报