【数据库】聚簇索引与非聚簇索引
目录
聚簇索引
非聚簇索引
辅助索引
使用聚簇索引的优劣势
优势
劣势
InnoDB索引实现
InnoDB聚簇索引
InnoDB辅助索引
MyISAM索引实现
MyISAM非聚簇索引
MyISAM辅助索引
两者都是使用B+树的数据结构,可以看一下这篇文章
聚簇索引
将数据和索引放在一起,并且是按照一定顺序组织的,找到索引也就找到了数据,数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻的存放在磁盘上的
一般情况下主键就是默认的聚簇索引
用图来解释就是这样的
上图就是按照主键建立的聚簇索引,叶子结点存储着该主键所有的信息
因为B+树是指在叶子结点存放数据,聚簇索引就是直接将行的所有数据存储在叶子结点上
InnoDB引擎就使用聚簇索引
非聚簇索引
叶子结点不存储数据,存储的是行的地址,也就是说根据索引查找到的数据行的位置,得到数据行的位置以后再去磁盘中查找数据
类似于一本书,非聚簇索引获得是书的目录,我们需要根据获得的目录(比如第三章第一节)然后到对应的页码获得内容
上图就是非聚簇索引,不像聚簇索引中保存的是行的所有信息,非聚簇索引保存的是数据的地址,具体的数据还需要根据地址进行查找
MyISAM引擎就使用的非聚簇索引
辅助索引
与结点存放的是主键的值
上图就是按照名字建立的辅助索引,对应的名字中只存储主键值
使用聚簇索引的优劣势
优势
1.查询通过聚簇索引可以直接获得数据,相比非聚簇索引需要二次查询(非覆盖索引的情况下)效率要高
2.聚簇索引对于范围查询效率很高,因为数据是按照大小排列的(主键)(B+树的特性)
3.聚簇索引适合在排序的场所,非聚簇索引不适合
劣势
1.维护索引很昂贵,特别是插入新行或者主键被更新导致要分页的时候。按照主键的插入顺序是最快的方式
2.当表使用UUId为之间的时候,会使数据存储稀松,就会出现聚簇索引比全表扫描更慢,所以建议使用int的自增作为主键
3.如果逐渐比较大的话,那辅助索引将会变的更大,因为辅助索引的叶子存储的是主键值,过长的主键值,会导致非叶子结点占用更多的物理空间
所以对于InnoDB表,我们一般都会定义一个自增的、不可更新的较小值作为主键
InnoDB索引实现
InnoDB聚簇索引
InnoDB中一定有主键,主键一定是聚簇索引,如果不手动设置,则会使用unique索引(每个列具有唯一的值,别的列都不相同),没有unique索引,则MySQL会自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整型
InnoDB辅助索引
辅助索引是建立在聚簇索引之上的,聚簇索引是根据主键值创建,辅助索引可以根据InnoDB表中的任何数据创建
比如将名字作为辅助索引,则叶子结点存储的值为名字(key)+主键
MyISAM索引实现
MyISAM非聚簇索引
MyISAM采用B+树作为索引结构,与InnoDB不同的是叶结点存放的是数据记录的地址,而不是行所有的值,MyISAM的聚簇索引是不能重复的
MyISAM辅助索引
主索引和辅助索引在结构上没有区别,只是主索引要求key是唯一的,而辅助索引的key可以重复
参考文章
聚簇索引和非聚簇索引(通俗易懂 言简意赅)_坚持住啊-CSDN博客膜拜!华为大牛透彻讲解Java面试100道必考题,不管你工作几年,都得看看!现在免费分享给大家!_哔哩哔哩_bilibili聚簇索引和非聚簇索引(通俗易懂 言简意赅)_坚持住啊-CSDN博客
MySQL 中的Innodb 聚簇索引和Myisam 的非聚簇索引_时光钟摆-CSDN博客
【数据库】聚簇索引与非聚簇索引相关推荐
- Mysql聚簇索引和非聚簇索引原理(数据库)
一.'页'和操作系统的关系 ①为什么要有内存管理? 我们知道,一个进程完成他的功能,需要访问磁盘加载数据到内存然后等待进入cpu运算,因为数据量大小远远大于内存大小.因此提出虚拟内存概念.虚拟内存就是 ...
- Mysql数据库索引的理解及聚簇索引和非聚簇索引的区别
Mysql数据库索引的理解及聚簇索引和非聚簇索引的区别 概念 索引是帮助Mysql搞笑获取数据的数据结构 对Mysql数据库来讲,其核心就是存储引擎,而索引就是属于存储引擎级别的概念,不同的存储引擎对 ...
- 数据库聚簇索引和非聚簇索引,页分裂的介绍及会产生的问题(整理自网络)
参考 http://www.mamicode.com/info-detail-549679.html https://blog.csdn.net/wen_3370/article/details/56 ...
- mysql聚簇索引存储结构_Mysql聚簇索引和非聚簇索引原理(数据库)
本文链接:https://blog.csdn.net/lisuyibmd/article/details/53004848 一.'页'和操作系统的关系 ①为什么要有内存管理? 我们知道,一个进程完成他 ...
- 数据库中的聚簇索引和非聚簇索引
聚簇索引和非聚簇索引的比较 聚簇索引和非聚簇索引最大的区别就在于数据和索引是否分开储存. 聚簇索引:将数据和索引一起储存,索引结构的叶子节点存的是数据行. 非聚簇索引:数据和索引分开储存,索引结构的叶 ...
- mysql 聚簇索引和非聚簇索引_聚簇索引和非聚簇索引
聚簇索引并不是一种单独的索引类型,而是一种数据存储方式.具体细节依赖于其实现方式. MySQL数据库中innodb存储引擎,B+树索引可以分为聚簇索引(也称聚集索引,clustered index)和 ...
- 聚簇索引与非聚簇索引学习总结
聚簇索引与非聚簇索引的区别 通常情况下,建立索引是加快查询速度的有效手段.但索引不是万能的,靠索引并不能实现对所有 数据的快速存取.事实上,如果索引策略和数据检索需求严重不符的话,建立索引反而会降低查 ...
- 聚簇索引、非聚簇索引、普通索引、唯一索引
一.聚簇索引 VS 非聚簇索引 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buf ...
- 浅析聚簇索引与非聚簇索引(也叫二级索引)
通俗点讲 聚簇索引:将数据存储与索引放到了一块,找到索引也就找到了数据 非聚簇索引:将数据存储于索引分开结构,索引结构的叶子节点指向了数据的对应行,myisam通过key_buffer把索引先缓存到内 ...
最新文章
- C# 汉字编码GB2312转换
- Kinect for Windows V2 SDK+ VS2012 环境搭建
- 【C++简明教程】Python和C++指定元素排序比较
- sqlalchemy数据库中的group_by()和order_by()使用
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(42)-工作流设计-表建立
- Linux下Java开发环境的搭建Tomcat6+jdk6+eclipse3.5.2+Myeclipse9.0+mysql5.1.47
- SAPMMC控制台服务消失的解决方法
- 中职生计算机专业600分,来了!超全盘点高职分类中500-600分及以上的高中生能报的专业和院校名单!...
- Linux 基本操作--文件查看 (day3)
- 探究foreach对于迭代变量的封装性的研究
- python 反弹shell,加了UDP
- 使用matlab生成含正弦波表数据ROM
- idea前端可视化_jsp可视化开发工具_netbeans jsp可视化_idea 可视化开发 jsp
- TSP_旅行商问题 - 遗传算法(四)
- smtplib库:Python使用QQ邮箱发送邮件
- 什么是数据分析报告,主要有什么价值?
- 【English】十一、一般疑问句
- 四年嵌入式技术沉淀,处女作《STM32CubeMX系列实战教程》诞生
- 修改Docker默认的数据目录
- LeetCode 51-60题