首页 > 数据库 >MySQL聚簇索引和非聚簇索引

MySQL聚簇索引和非聚簇索引

时间:2022-11-10 17:47:53浏览次数:40  
标签:非聚 辅助 聚簇 索引 InnoDB 数据 主键

  聚簇索引和非聚簇索引     在InnoDB中,表数据文件本身就是按 B+Tree 组织的一个索引结构,聚簇索引就是按照 每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚簇索引的叶子节点称为数据页。这个特性决定了索引组织表中的数据也是索引的一部分。   一般建表会用一个自增主键做聚簇索引,没有的话 MySQL会默认创建,但是这个主键如果要更改代价比较高,故建表时要考虑自增 ID 不能频繁 UPDATE 这点。   平时工作中,根据实际情况自行添加的索引都是辅助索引,辅助索引就是一个为了需找主键索引的二级索引,先找到主键索引再通过主键索引找数据。   聚簇索引并不是单的的索引类型,而是一种数据存储方式。具体依赖于其实现方式。   MySQL 数据库中 InnoDB 存储引擎,B+ 树索引可以分为聚簇索引(也称聚集索引,clustered index)和辅助索引(有时也称非聚簇索引或二级索引,secondary index,non-clustered index)。这两种索引内部都是 B+树,聚集索引的叶子节点存放着一整行的数据。   InnoDB 中的主键索引就是一种聚簇索引,非聚簇索引都是引用索引,像复合索引,前缀索引,唯一索引。   InnoDB 使用的是聚簇索引,MyISAM使用的是非聚簇索引。     聚簇索引(聚集索引)     聚簇索引就是按照每张表的主键构造一颗 B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分,每张表只能拥有一个聚簇索引。 InnoDB通过主键聚集索引,如果没有定义主键,InnoDB会选择非空的唯一索引替代。如果没有这样的索引,InnoDB会隐式的定义一个主键来作为聚簇索引。   优点:     a. 数据访问更快,因为聚簇索引将索引和数据保存在同一个 B+ 树中,因此从聚簇索引中获取数据比非聚簇索引更快。     b. 聚簇索引对主键的排序和范围查找速度非常快。   缺点:     a. 插入速度严重依赖于顺序插入,按照主键的插入顺序是最快的方式,否则会出现页分裂,严重影响性能。因此,对于 InnoDB表,我们一般都会定义一个自增的 ID 列为主键。     b. 更新主键的代价很高,因为将会导致被更新的行移动。因此,对于 InnoDB表,一般定义主键为不可更新。     c. 二级索引访问需要两次索引查找,第一次找到主键,第二次根据主键值找到行数据。     辅助索引(非聚簇索引)     在聚簇索引上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找。辅助索引叶子节点存储的不再是行的物理位置,而是主键值。通过辅助索引首先找到主键值,再通过主键值找到数据行的数据页,再通过数据页中的 Page Directory找到数据行。     InnoDB辅助索引的叶子节点并不包含行记录的全部数据,叶子节点 除了包含键值外,还包含了对应行数据的聚簇索引键。     辅助索引的存在不影响聚簇索引中的组织,所以一张表可以有多个 辅助索引。在 InnoDB中 有时也称辅助索引为二级索引。          

标签:非聚,辅助,聚簇,索引,InnoDB,数据,主键
From: https://www.cnblogs.com/qiezi777/p/16877844.html

相关文章

  • MySQL的InnerDB和MySAM索引实现
     InnoDB索引实现 InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。InnoDB的主索引:MyISAM索引文件和数据文件是分离的,索引文件仅保......
  • Android工程导入AS同时建立索引
    /打开太慢可以尝试重新配置AndroidStudioVM内存限制Help→ EditCustomVMOptions进入studio64.exe.vmoptions(Windows系统不一样,打开文件有差异)文件末尾添加两行:-X......
  • MySQL的索引(二十三)
    勿以恶小而为之,勿以善小而不为--------------------------刘备上一章简单介绍了MySQL的视图(二十二),如果没有看过,​​请观看上一章​​一.索引一.一索引的产生前面已经......
  • MySQL为什么有时候会选错索引?以及什么情况索引会失效?
    MySQL为什么有时候会选错索引?MySQL判断选择哪个索引时,这个是优化器的工作。优化器会根据扫描的行数、是否回表、是否使用临时表、排序等来判断使用索引还是全表扫......
  • pytorch张量索引
    一、pytorch返回最值索引1官方文档资料1.1torch.argmax()介绍 返回最大值的索引下标函数:torch.argmax(input,dim,keepdim=False)→LongTensor返回值:Retur......
  • 【pyfaidx】纯Python实现的FASTA随机索引库
    前言基因组序列的提取,有不少强大的工具像samtools,bedtools,之前也提到pybedtools提取序列。不过pybedtools是对bedtools提供一个Python接口,除了安装pybedtools外,还需......
  • B+树索引适⽤的条件
    假设有张存储人基本信息的表,DDL如下:CREATETABLEperson_info(    idINTNOTNULL auto_increment,    nameVARCHAR(100)NOTNULL,    birthdayDATENOT......
  • ElasticSearch Java API之索引操作
    背景:​​ElasticSearchJava客户端连接ElasticSearch​​以这篇博客为基础​​ElasticSearch:简单介绍以及使用Docker部署ElasticSearch和Kibana​​这篇博客简单部署了E......
  • 【MySQL】深入理解MySQL索引原理(MySQL专栏启动)
    本文导读本篇文章博主对索引做了一个较为初步地概述,主要有2种主要的索引的数据结构b+tree和hash的数据结构,b+树的覆盖索引和回表进行分析,并对b+树存放记录、如何优化B+树索......
  • 【MySQL】深入理解MySQL索引优化器工作原理
    本文导读本文将解读MySQL数据库查询优化器(CBO)的工作原理。简单介绍了MySQLServer的组成,MySQL优化器选择索引额原理以及SQL成本分析,最后通过select查询总结整个查询过程。......