mysql索引总结(3)-MySQL聚簇索引和非聚簇索引

非聚簇索引

索引节点的叶子页面就好比一片叶子。叶子头便是索引键值。

先创建一张表:

CREATE TABLE `user` (
`id` INT NOT NULL ,
`name` VARCHAR NOT NULL ,
`class` VARCHAR NOT NULL);

对于MYISAM引擎,如果创建 id 和 name 为索引。对于下面查询:

select * from user where id = 1

会利用索引,先在索引树中快速检索到 id,但是要想取到id对应行数据,必须找到改行数据在硬盘中的存储位置,因此MYISAM引擎的索引 叶子页面上不仅存储了主键id 还存储着 数据存储的地址信息。如图:

像这样的索引就称为非聚簇索引。

非聚簇索引的二级索引与主键索引类似。假设我们对name添加索引,那么name的索引树叶子将是如下结构:

聚簇索引

对于 非聚簇索引 来说,每次通过索引检索到所需行号后,还需要通过叶子上的磁盘地址去磁盘内取数据(回行)消耗时间。为了优化这部分回行取数据时间,InnoDB 引擎采用了聚簇索引。

聚簇索引,即将数据存入索引叶子页面上。对于 InnoDB 引擎来说,叶子页面不再存该行对应的地址,而是直接存储数据:

这样便避免了回行操作所带来的时间消耗。 使得 InnoDB 在某些查询上比 MyISAM 还要快!

ps. 关于查询时间,一般认为 MyISAM 牺牲了功能换取了性能,查询更快。但事实并不一定如此。多数情况下,MyISAM 确实比
InnoDB 查的快 。但是查询时间受多方面因素影响。InnoDB 查询变慢得原因是因为支持事务、回滚等等,使得
InnoDB的叶子页面实际上还包含有事务id(换句话说就是版本号) 以及回滚指针。

在二级索引方面, InnoDB 与 MyISAM 有很大区别。

InnoDB默认对主键建立聚簇索引。如果你不指定主键,InnoDB会用一个具有唯一且非空值的索引来代替。如果不存在这样的索引,InnoDB会定义一个隐藏的主键,然后对其建立聚簇索引。一般来说,InnoDB
会以聚簇索引的形式来存储实际的数据,它是其它二级索引的基础。

假设对 InnoDB 引擎上表name字段加索引,那么name索引叶子页面则只会存储主键id:

检索时,先通过name索引树找到主索引id,再通过id在主索引树的聚簇索引叶子页面取出数据。

时间: 2024-08-01 12:21:37

mysql索引总结(3)-MySQL聚簇索引和非聚簇索引的相关文章

mysql索引总结(2)-MySQL聚簇索引和非聚簇索引

聚簇索引就是对磁盘上的实际数据重新组织以按照特定的一个或者多个列的值排序的算法 特点是存储数据的顺序和索引顺序一致 一般情况下主键会默认生成聚簇索引 且一张表有且只有一个聚簇索引 聚簇索引和非聚簇索引的区别是: 聚簇索引的叶子节点就是数据节点 而非聚簇索引的叶子节点仍然是索引文件 只是这个索引文件中包含指向对应数据块的指针 MySQL中不同的数据存储引擎对聚簇索引有不同的支持 MyISAM使用的是非聚簇索引 原始数据 存储方式 按照列值和行号来组织索引的 叶子节点中保存的实际上是指向存放数据块的

【Mysql优化】聚簇索引与非聚簇索引概念

首先明白两句话: innodb的次索引指向对主键的引用  (聚簇索引) myisam的次索引和主索引   都指向物理行 (非聚簇索引) 聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法.特点是存储数据的顺序和索引顺序一致.一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引(理由:数据一旦存储,顺序只能有一种). 在<数据库原理>一书中是这么解释聚簇索引和非聚簇索引的区别的: 聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对

MySQL 聚簇索引和非聚簇索引的认识

聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法.特点是存储数据的顺序和索引顺序一致.一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引. 在<数据库原理>一书中是这么解释聚簇索引和非聚簇索引的区别的:聚簇索引的叶子节点就是数据节点,而非聚簇索引的叶子节点仍然是索引节点,只不过有指向对应数据块的指针. 因此,MYSQL中不同的数据存储引擎对聚簇索引的支持不同就很好解释了.下面,我们可以看一下MYSQL中MYISAM和INNODB两种引擎的索引结构 myisa

MySQL中Innodb的聚簇索引和非聚簇索引

聚簇索引 数据库表的索引从数据存储方式上可以分为聚簇索引和非聚簇索引(又叫二级索引)两种.Innodb的聚簇索引在同一个B-Tree中保存了索引列和具体的数据,在聚簇索引中,实际的数据保存在叶子页中,中间的节点页保存指向下一层页面的指针.“聚簇”的意思是数据行被按照一定顺序一个个紧密地排列在一起存储.一个表只能有一个聚簇索引,因为在一个表中数据的存放方式只有一种. 一般来说,将通过主键作为聚簇索引的索引列,也就是通过主键聚集数据.下图展示了Innodb中聚簇索引的结构(图片来自<高性能MySQL

MySQL聚簇索引和非聚簇索引的对比

首先要清楚:聚簇索引并不是一种单独的索引类型,而是一种存储数据的方式. 聚簇索引在实际中用的很多,Innodb就是聚簇索引,Myisam 是非聚簇索引. 在之前我想插入一段关于innodb和myisam的数据文件的对比: innodb一张表在硬盘上通过两个文件存储:tablename.frm,tablename.ibd,而myisam有三个文件:tablename.frm,tablename.myi,tablename.myd. frm是表结构文件,myi是索引文件,myd是数据文件,ibd是数

mysql索引总结(1)-mysql 索引类型以及创建

文章归属:http://feiyan.info/16.html,我想自己去写了,但是发现此君总结的非常详细.直接搬过来了 关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是一个人力三轮车.对于没有索引的表,单表查询可能几十万数据就是瓶颈,而通常大型网站单日就可能会产生几十万甚至几百万的数据,没有索引查询会变的非常缓慢.还是以WordPress来说,其多个数据表都会对经常被查询的字段添加索引,比如wp_comments表中针

02: MySQL 索引类型 、 MySQL 存储引擎

day02一.mysql索引二.MySQL存储引擎+++++++++++++++++++++++++++++++++++一.mysql索引1.1 索引介绍 : 相当于 "书的目录" 5000页1~200 目录信息拼音排序部首排序笔画排序 201~5000 正文 1.2 索引的优点与缺点?优点 加快查询的速度缺点 占用物理存储空间,减慢写的速度. 姓名 性别 班级 年龄jimjimNULL 1.3 使用普通索引index:(在表中的字段上创建索引)使用规则?查看 desc 表名: key

通俗易懂 索引、单列索引、复合索引、主键、唯一索引、聚簇索引、非聚簇索引、唯一聚簇索引 的区别与联系

索引 数据库只做两件事情:存储数据.检索数据.而索引是在你存储的数据之外,额外保存一些路标(一般是B+树),以减少检索数据的时间.所以索引是主数据衍生的附加结构. 一张表可以建立任意多个索引,每个索引可以是任意多个字段的组合.索引可能会提高查询速度(如果查询时使用了索引),但一定会减慢写入速度,因为每次写入时都需要更新索引,所以索引只应该加在经常需要搜索的列上,不要加在写多读少的列上. 单列索引 与 复合索引 只包含一个字段的索引叫做单列索引,包含两个或以上字段的索引叫做复合索引(或组合索引).

聚簇索引与非聚簇索引

索引是一种数据结构,用来快速访问数据库表格或者视图中的数据. 索引的目的是加快对表中数据记录的查找或排序. 索引的代价一是增加了数据库的存储空间,二是在插入和修改时要花费更多的时间. 索引有两中形式,聚簇索引和非聚簇索引 聚簇索引也叫聚集索引,是一种对磁盘上数据重新组织以按指定 的一个或多个列的值排列.每张表只能建一个聚簇索引,并且建聚簇索引需要至少相当该表120%的附加空间,以存放该表的副本和索引中间页. 非聚簇索引的索引顺序与数据物理顺序无关. 聚簇索引和非聚簇的区别: 1.聚簇索引的叶节点