博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL 聚簇索引和非聚簇索引
阅读量:4207 次
发布时间:2019-05-26

本文共 842 字,大约阅读时间需要 2 分钟。

聚簇索引就是对磁盘上的实际数据重新组织以按照特定的一个或者多个列的值排序的算法

特点是存储数据的顺序和索引顺序一致 一般情况下主键会默认生成聚簇索引 且一张表有且只有一个聚簇索引

聚簇索引和非聚簇索引的区别是:

聚簇索引的叶子节点就是数据节点 而非聚簇索引的叶子节点仍然是索引文件 只是这个索引文件中包含指向对应数据块的指针

MySQL中不同的数据存储引擎对聚簇索引有不同的支持

MyISAM使用的是非聚簇索引

原始数据

这里写图片描述

存储方式

这里写图片描述

按照列值和行号来组织索引的 叶子节点中保存的实际上是指向存放数据块的指针

从物理文件中也可以看出 MyISAM的索引文件.MYI和数据文件.MYD是分开存储的 是相对独立的

对于InnoDB引擎来说,是按照聚簇索引的形式存储数据

这里写图片描述

它的每个聚簇索引的叶子节点都包含主键值、事务ID、回滚指针(用于事务和MVCC)以及余下的列。

从物理文件也可以看出 InnoDB的数据文件只有数据结构文件.frm和数据文件.idb 其中.idb中存放的是数据和索引信息 是存放在一起的

InnoDB的二级索引和主键索引也有很大的不同 二级索引存放的是主键值而不是行指针 减少了移动数据或者分裂时维护二级索引的开销,因为不需要更新索引的行指针

这里写图片描述

MyISAM和InnoDB的二级索引的对比

这里写图片描述

从图中可以看出 InnoDB二级索引的叶子节点存放的是KEY字段+主键值,因此首先通过二级索引查找到的是主键值,再根据主键值在朱建索引中查找到相应的数据文件。

而MyISAM的二级索引存放的还是列值和行号的组合 叶子节点中保存的是指向物理数据的指针,因此它的主建索引和二级索引的结构并没有任何区别,只是说主键索引的索引值是唯一且非空的,而MyISAM引擎可以不设置主键。

InnoDB引擎是必须设置主键的,需要依赖主键生成聚簇索引,因此当没有指定主键的时候,InnoDB引擎会默认寻找一个可以唯一标识每行数据的列作为主键,当这种列不存在的时候,会默认生成一个6字节整型的隐藏列作为主键


你可能感兴趣的文章
CSS 相对|绝对(relative/absolute)定位系列(一)
查看>>
CSS 相对|绝对(relative/absolute)定位系列(二)
查看>>
CSS 相对|绝对(relative/absolute)定位系列(三)
查看>>
纯CSS实现侧边栏/分栏高度自动相等
查看>>
CSS布局奇淫巧计之-强大的负边距
查看>>
改变CSS世界纵横规则的writing-mode属性
查看>>
理解CSS3 max/min-content及fit-content等width值
查看>>
word-break:break-all和word-wrap:break-word的区别
查看>>
CSS深入理解vertical-align和line-height的基友关系
查看>>
CSS 中的内联元素、块级元素以及display的各个属性的特点
查看>>
css行高line-height的一些深入理解及应用
查看>>
我对CSS vertical-align的一些理解与认识(一)
查看>>
我对CSS vertical-align的一些理解与认识(二)
查看>>
去除inline-block元素间间距的N种方法
查看>>
CSS中height:100%和height:inherit的异同
查看>>
absolute元素在text-align属性下的对齐显示
查看>>
CSS3选择器:nth-child和:nth-of-type之间的差异
查看>>
微信小程序知识点GET
查看>>
微信小程序组件知识点GET
查看>>
微信小程序API~GET
查看>>