Mysq|聚簇和非聚簇索引的区别?????

简介: Mysq|聚簇和非聚簇索引的区别?????

一、都是B+树的数据结构


●聚簇索引:将数据存储与索引放到了一块、并且是按照-定的顺序组织的,找到索引也就找到了数据,数据的物理存放顺序与索引|顺序是一致的, 即:只要索引|是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的

●非聚簇索张:叶子节点不存储数据、存储的是数据行地址,也就是说根据索引查找到数据行的位置再取磁盘查找数据,这个就有点类似一本树的目录,比如我们要找第三章第一节,那我们先在这个目录里面找,找到对应的页码后再去对应的页码看文章。


二、优势


1、查询通过聚簇索引可以直接获取数据,相比非聚族索引需要第二次查询(非覆盖索引的情况下)效率要高

2、聚簇索引对于范围查询的效率很高,因为其数据是按照大小排列的

3、聚簇索引适合用在排序的场合,非聚簇索引不适合


三、劣势:


1、维护索引很昂贵,特别是插入新行或者主键被更新导至要分页(page split)的时候。 建议在大量插入新行后,选 在负载较低的时间段,通过OPTIMIZE TABLE优化表,因为必须被移动的行数据可能造成碎片。使用独享表空间可以弱化碎片

2、表因为使用UUId (随机ID)作为主键,使数据存储稀疏,这就会出现聚族索引有可能有比全表扫面更慢,所以建议使用int的auto_ increment作为主键

3、如果主键比较大的话,那辅助索引将会变的更大,因为辅助索引的叶子存储的是主键值:过长的主键值,会导致非叶子节点占用占用更多的物理空间


InnoDB中一定有主键, 主键一定是聚簇索引, 不手动设置、则会使用unique索引,没有unique索引, 则会使用数据库内部的一个行的隐藏id来当作主键索引。在聚簇索引之上创建的索弓称之为辅助索引,辅助索弓|访问数据总是需要二次查找,非聚簇索引都是辅助索引,像复合索引、前缀索引、唯一索引, 辅助索引叶子节点存储的不再是行的物理位置,而是主键值。


MyISM使用的是非聚簇索引,没有聚簇索引,非聚簇索引|的两棵B+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引B+树的节点存储了主键,辅助键索引|B+树存储了辅助键。表数据存储在独立的地方,这两颗B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通过辅助键检索无需访问主键的索弓|树。

如果涉及到大数据量的排序、全表扫描、count之 类的操作的话,还是MyISAM占优势些,因为索引所占空间小,这些操作是需要在内存中完成的。


五、B+树与哈希索引


索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B+树索引等,InnoDB存储弓|擎的默认索引实现为: B+树索引。对于哈希索弓l来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择BTree索引。


B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的节点间有指针相互链接。 在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索弓|的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高。因此,B+树索引被广泛应用于数据库、文件系统等场景。

目录
相关文章
|
监控 Java 索引
ES 生产中10个常见参数阈值(默认最大值)操作及优化解决方案
ES 生产中10个常见参数阈值(默认最大值)操作及优化解决方案
ES 生产中10个常见参数阈值(默认最大值)操作及优化解决方案
|
SQL 消息中间件 数据处理
DataX读取Hive Orc格式表丢失数据处理记录
DataX读取Hive Orc格式表丢失数据处理记录
648 0
【STM32】引脚GPIO批量操作数组&for循环流水灯
【STM32】引脚GPIO批量操作数组&for循环流水灯
1335 0
|
5月前
|
存储 JavaScript
手机号码生成器的实现代码
根据选择的运营商号段生成随机号码,支持生成、保存、导出及复制操作,历史记录可持久化存储,方便实用。
|
小程序
TDesign电商小程序模板解析01-自定义底部导航栏(二)
TDesign电商小程序模板解析01-自定义底部导航栏(二)
|
11月前
|
机器学习/深度学习 存储 人工智能
《DeepSeek情感分析技术:突破与创新,精准判断情感倾向》
在数字化时代,文本数据激增,情感分析成为关键需求。DeepSeek作为AI领域的佼佼者,基于Transformer架构实现深度语义理解,通过多模态融合技术全面感知情感,结合领域自适应与迁移学习跨越不同场景,采用对抗训练提升鲁棒性,并融合情感词典与知识图谱增强理解。这些创新使DeepSeek能精准判断情感倾向,为企业和研究提供有力支持。
1287 20
|
8月前
|
传感器 编解码 开发者
DevEcoStudio 中使用模拟器时如何过滤日志
在鸿蒙开发中,使用 DevEcoStudio 模拟器时,无过滤模式会输出所有系统日志,可能造成信息过载。为高效调试,可自定义日志过滤规则:进入 Hilog > Settings > Filter,设置 Log level(如 Info)和 Log message(如 A03d00/JSAPP)。日志内容涵盖启动、系统运行、应用及硬件模拟等类型,级别包括 DEBUG、INFO、WARN、ERROR 和 FATAL,助您精准定位问题。
214 0
|
JavaScript Java 测试技术
基于SpringBoot+Vue的宠物托管系统的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue的宠物托管系统的详细设计和实现(源码+lw+部署文档+讲解等)
403 9
|
机器学习/深度学习 存储 监控
基于YOLOv8深度学习的野外火焰烟雾检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测(1)
基于YOLOv8深度学习的野外火焰烟雾检测系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战、目标检测