社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  DATABASE

MySQL快速理解什么是聚簇索引和非聚簇索引?

雪湖孤舟翁 • 2 年前 • 215 次点击  
阅读 59

MySQL快速理解什么是聚簇索引和非聚簇索引?

什么是聚簇索引?

聚簇索引首先并不是一种索引类型,而是一种数据存储方式,我的理解是,是否为聚簇索引实际上指的就是b+树的具体实现方式,也就是每个节点的data域里面到底放什么东西。究竟放的是具体的数据,还是指向数据的“指针”?

先给出一个结论:InnoDB存储引擎的主键使用的是聚簇索引,而非主键使用的称作:“辅助索引”、“二次索引”,而MqISAM存储引擎无论主键,还是非主键使用的索引都是一样的:“非聚簇索引”。

InnoDB存储引擎

主键使用:聚簇索引

本质上是在b+树索引的叶子节点上的data域里保存的就是对应行的全部数据。

InnoDB主键索引的使用的就是聚簇索引。因此,被索引的列必须是主键列,如果没有主键,会选择一个唯一的非空索引代替,如果也没有这样的索引,那么会隐式定义一个主键来作为聚簇索引。因此,也可以说聚簇索引就是按照表的主键构造的一个b+树,同时叶子节点里面存储了表的行数据。

也正因为只有主键才能使用,因此,一张表只有一个聚簇索引。

非主键使用:辅助索引、二次索引

其实书上还写了一个小括号,把二次索引也归类为非聚簇索引,如果以data域是否直接保存数据来划分的话,确实可以这么说,但是这里还是把它称作辅助索引,因为这样不容易引起混淆。

这指的是InnoDB存储引擎对于非主键列的索引??,在他的b+树的叶子节点的data域保存了行的主键值,因此这种索引方式都需要“二次查找”,也就是说先通过辅助索引首先找到的主键值,再通过主键值去聚簇索引中查找对应的行数据。

MyISAM存储引擎

主键,非主键:非聚簇索引

就是指B+Tree的叶子节点上的data域并不直接保存数据,而是数据的地址(其实也可以叫做指针)。并且Myisam引擎的主索引和辅助索引在结构上没有任何区别,唯一的区别是主索引要求key是唯一的,而辅助索引的key可以重复。

聚簇和非聚簇的对比

image.png

聚簇索引优缺点

1、访问速度快,因为把索引和数据放在了一起,只要找到了索引,立即可以获得数据

2、相比非聚簇索引,可以减少磁盘的io次数。因为非聚簇索引没有直接保存数据

3、一个数据表只能有一个聚簇索引,但可以有多个非聚簇索引;

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/119045
 
215 次点击