Mysql - 聚簇索引和辅助索引
聚簇索引和辅助索引
聚簇索引:数据是存放在叶子节点上。
辅助索引:叶子节点上是不存放真实数据的,而是存放聚簇索引的索引值。
首先说明一下,聚簇索引和辅助索引都是B+树的结构,区别就是叶子节点上是否存放真实的数据。那么为什么有这个区分呢。其实也很好理解,我们都知道,Mysql中的每一个索引都是一颗B+树来存储的,如果我每一颗B+树的叶子节点上面都存储数据的话,这个空间的要求是不是很大呢?当然,也可以所有的索引都不存储真实的数据,都存储指向真实数据的索引,这是MyISAM存储引擎的做法。
在Innodb存储引擎中,DBA一般都会要求我们建立一个自增长的,为整数型的值为主键索引,为什么呢?其实就是要用这个主键做聚簇索引,聚簇索引中的值是不重复的。那么我们要不键这种自增长的唯一主键索引,Mysql会怎么办呢?它会在你的其他索引中选取一个唯一索引来做这件事情,如果没有唯一索引的话,Mysql会自己帮我们维护一个索引,就是会帮我们这张表建立一个隐藏列,用作聚簇索引的建立。而每一张表只有这一个聚簇索引,并且存储真实的数据。
对比的来看,MyISAM存储引擎使用的都是辅助索引,即没有一棵B+树上存储了真实数据,都是指向真实数据的索引,这也是为什么当Mysql的表使用了MyISAM存储引擎的时候,会产生三个文件。一个表结构、一个就是真实数据、一个索引文件。而使用Innodb存储引擎的表,只有两个,一个表结构,另外一个包含了索引和真实数据。
那么为什么聚簇索引不建议使用类似于UUID的方式呢,因为UUID过于离散,B+树的叶子节点都在一个层级,要维护这个平衡主要方法就是分裂,如果是这种不规则的话,很有可能每次新来的数据在这个B+树的中间,就会造成B+树为了维护平衡不必要的分裂和调整,而整数型的话,每次的数据都是插到树的最后,相对来说就会稳定的多。另外整数型所占用的存储空间也会相对较少,我们知道辅助索引叶子节点存储的是聚簇索引的索引值,占用空间较小的索引值也是很有必要的。
每次使用辅助索引检索都要经过两次B+树查找(一次辅助索引的查找到索引值,和一次聚簇索引查找到真实的数据),看上去聚簇索引的效率明显要低于非聚簇索引,这不是多此一举吗?聚簇索引的优势在哪?
1.由于行数据和聚簇索引的叶子节点存储在一起,同一页中会有多条行数据,访问同一数据页不同行记录时,已经把页加载到了Buffer中(缓存器),再次访问时,会在内存中完成访问,不必访问磁盘。这样主键和行数据是一起被载入内存的,找到叶子节点就可以立刻将行数据返回了,如果按照主键Id来组织数据,获得数据更快。
2.辅助索引的叶子节点,存储主键值,而不是数据的存放地址。好处是当行数据放生变化时,索引树的节点也需要分裂变化;或者是我们需要查找的数据,在上一次IO读写的缓存中没有,需要发生一次新的IO操作时,可以避免对辅助索引的维护工作,只需要维护聚簇索引树就好了。另一个好处是,因为辅助索引存放的是主键值,减少了辅助索引占用的存储空间大小。
注:我们知道一次io读写,可以获取到16K大小的资源,我们称之为读取到的数据区域为Page。而我们的B树,B+树的索引结构,叶子节点上存放好多个关键字(索引值)和对应的数据,都会在一次IO操作中被读取到缓存中,所以在访问同一个页中的不同记录时,会在内存里操作,而不用再次进行IO操作了。除非发生了页的分裂,即要查询的行数据不在上次IO操作的换村里,才会触发新的IO操作。
3.因为MyISAM的主索引并非聚簇索引,那么他的数据的物理地址必然是凌乱的,拿到这些物理地址,按照合适的算法进行I/O读取,于是开始不停的寻道不停的旋转。聚簇索引则只需一次I/O。(强烈的对比)
4.不过,如果涉及到大数据量的排序、全表扫描、count之类的操作的话,还是MyISAM占优势些,因为索引所占空间小,这些操作是需要在内存中完成的。
— (文章小部分内容截取自网络)
Mysql - 聚簇索引和辅助索引相关推荐
- mysql 聚簇索引和非聚簇索引_聚簇索引和非聚簇索引
聚簇索引并不是一种单独的索引类型,而是一种数据存储方式.具体细节依赖于其实现方式. MySQL数据库中innodb存储引擎,B+树索引可以分为聚簇索引(也称聚集索引,clustered index)和 ...
- MySQL聚簇索引和非聚簇索引的理解
关于聚簇索引和非聚簇索引的概念很多同学找了很多教程但是仍然很迷糊. 这里给出一篇翻译,并给出我的配图,希望对大家理解有帮助. 英文原文:http://www.mysqltutorial.org/mys ...
- mysql聚簇索引的页分裂原理实例分析
本文实例讲述了mysql聚簇索引的页分裂.分享给大家供大家参考,具体如下: 在MySQL中,MyISAM采用的是非聚簇索引的,InnoDB存储引擎是采用聚簇索引的. 聚簇结构的特点: 根据主键查询条目 ...
- mysql聚簇索引存储结构_MySQL聚簇索引的实际应用于结构描述
以下的文章主要介绍的是高性能的MySQL索引策略之MySQL聚簇索引(Clustered Indexes),我们大家都知道MySQL聚簇索引(Clustered Indexes),在实际应用中比例还是 ...
- Mysql聚簇索引和费聚簇索引的区别
目录 一.二叉树.平衡二叉树.红黑树.B树.B+树 二.索引的介绍 三.Mysql聚簇索引和费聚簇索引的区别 参考连接 一.二叉树.平衡二叉树.红黑树.B树.B+树 树结构(二)--二叉搜索树.平衡二 ...
- mysql 聚簇索引页分裂_mysql聚簇索引的页分裂原理是什么 mysql聚簇索引的页分裂原理解析...
本篇文章小编给大家分享一下mysql聚簇索引的页分裂原理解析,小编觉得挺不错的,现在分享给大家供大家参考,有需要的小伙伴们可以来看看. 在MySQL中,MyISAM采用的是非聚簇索引的,InnoDB存 ...
- mysql 聚簇索引和非聚簇索引_MySQL 聚簇索引 二级索引 辅助索引(上两期中奖名单)...
阅读文本大概需要3分钟. MySQL中每个表都有一个聚簇索引( clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引( secondary indexes ). ...
- mysql 聚簇索引 和聚簇索引 (二级索引)的 那些事
mysql的聚簇索引是指innodb引擎的特性,mysiam并没有,如果需要该索引,只要将索引指定为主键(primary key)就可以了. 比如: [sql] view plaincopy crea ...
- 在mysql中建立聚簇索引_给我一分钟,让你彻底明白MySQL聚簇索引和非聚簇索引...
推荐阅读:吊打面试官!MySQL灵魂100问,你能答出多少? MySQL的InnoDB索引数据结构是B+树,主键索引叶子节点的值存储的就是MySQL的数据行,普通索引的叶子节点的值存储的是主键值,这是 ...
- Mysql聚簇索引和非聚簇索引原理(数据库)
一.'页'和操作系统的关系 ①为什么要有内存管理? 我们知道,一个进程完成他的功能,需要访问磁盘加载数据到内存然后等待进入cpu运算,因为数据量大小远远大于内存大小.因此提出虚拟内存概念.虚拟内存就是 ...
最新文章
- 2018年看好这些半导体企业
- 使用CoreData的轻量级自动数据迁移
- Spring MVC 拦截器 interceptor 详解
- php 设置时区_为什么没有 Asia/Beijing 时区?
- 成功解决AttributeError: module ‘tensorflow‘ has no attribute ‘get_variable‘
- 【WebRTC---入门篇】(八)WebRTC核心之RTP Medio 媒体控制与数据统计
- JavaScript 操作 HTML DOM (文档对象模型) 相关知识点
- dashboard windows 前端开发环境搭建
- 信息学奥赛一本通 1101:不定方程求解 | OpenJudge NOI 2.1 7650 | 小学奥数 7650
- Oracle11g数据库监听配置
- 怎么自动选中select中所有option
- iOS 给测试人员测试手机APP的四种方法:真机运行(略),打ipa包,(testFlighe)邮件,蒲公英(一)打ipa包
- xmpp即时通讯协议的特性---优点和缺点!
- 可调电阻封装图_看过来!!国产大神把ZXD2400 v4.3完美改造成60V50A可调数控电源...
- 【URL重写】IIS7配置URL重写
- c语言 教学设计,C语言教案
- 错误: 找不到符号 java
- html弹性布局平均分配,flex弹性布局.html
- 电影票务大排行:猫眼第一,淘票票、格瓦拉分列二、三位!
- mpvue+mpvueWeUI搭建小程序