MySQL两种引擎的索引

news2024/9/23 5:27:38

推荐看看这个视频,将两种引擎实现的索引原理说的比较清楚

4-2 索引概述

本文转载:想飞的盗版鱼的博客​​​​​​ 

mysql5.5之后都是用idb了

补充一个主键和索引的关系:Are You OK?主键就是聚集索引吗?

索引类型

索引根据底层实现可分为B-Tree索引和哈希索引,大部分时候我们使用的都是B-Tree索引,因为它良好的性能和特性更适合于构建高并发系统。

根据索引的存储方式来划分,索引可以分为聚簇索引非聚簇索引。聚簇索引的特点是叶子节点包含了完整的记录行,而非聚簇索引的叶子节点只有所以字段和主键ID。

根据聚簇索引和非聚簇索引还能继续下分还能分为普通索引、覆盖索引、唯一索引以及联合索引等。

  

 总结

主键一定是聚簇索引,MySQL的InnoDB中一定有主键,即便研发人员不手动设置,则会使用unique索引,没有unique索引,则会使用数据库内部的一个行的id来当作主键索引,其它普通索引需要区分SQL场景,当SQL查询的列就是索引本身时,我们称这种场景下该普通索引也可以叫做聚簇索引,MyisAM引擎没有聚簇索引。

叶子结点是个双向链表,普通的b+树结构下面是单链表女朋友问我:为什么 MySQL 喜欢 B+ 树?我笑着画了 20 张图 (qq.com)

InnoDB和MyISAM的特点及区别:
InnoDB:

支持事务操作(并且实现了SQL标准的四种隔离级别)
支持行级锁(查询速度快)和表级索
不支持全文索引(没有保存表的行数)
是聚簇索引(因为索引文件和数据哎同一个文件下)
是数据库默认的存储引擎


MyISAM:

不支持事务
不支持行级锁和外键
若表建立时指定存储引擎是MyISAM,则生成表时会生成3个文件:
.frm文件存储表定义
.MYI文件存储索引文件
.MYD文件存储数据表中的数据
是非聚簇索引(因为索引文件和数据表中的数据是分开的)
区别:

MyISAM是非事务的,InnoDB是事务安全的
MyISAM是表级的,InnoBD是行级的
MyISAM支持全文索引,InnoBD不支持全文索引
MyISAM相对简单,效率优于InnoDB (小型应用可以考虑使用MyISAM)
MyISAM表保存成文件形式,跨平台使用更加方便
以上为比较普通的区别,下面这几个是面试官比较相同的区别:

1) count运算上的区别: 因为MyISAM缓存有表meta-data(行数等),因此在做COUNT(*)时对于一个结构很好的查询是不需要消耗多少资源的。而对于InnoDB来说,则没有这种缓存。

2) 是否支持事务和崩溃后的安全恢复: MyISAM 强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。但是InnoDB 提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。

3)是否支持外键: MyISAM不支持,而InnoDB支持。

总结:

MyISAM更适合读密集的表,而InnoDB更适合写密集的的表。 在数据库做主从分离的情况下,经常选择MyISAM作为主库的存储引擎。

一般来说,如果需要事务支持,并且有较高的并发读取频率(MyISAM的表锁的粒度太大,所以当该表写并发量较高时,要等待的查询就会很多了),InnoDB是不错的选择。如果你的数据量很大(MyISAM支持压缩特性可以减少磁盘的空间占用),而且不需要支持事务时,MyISAM是最好的选择。

MyISAM的索引实现:
MyISAM引擎使用B+Tree作为索引结构,叶子节点的data域存放的是数据记录的地址。


可以看出,MyISAM的索引文件仅仅保存数据记录的地址。
在MyIASM中,主索引和辅助索引在结构上没有任何区别,只要主索引要求key是唯一的,而辅助索引的key可以重复。

因此,MyISAM中索引检索算法为首先按照B+Tree搜索算法搜索索引,若指定的key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。

==>MyISAM的索引方式也叫“非聚集的”

InnoDB的索引实现:
虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。

第一个重大区别:

InnoDB的数据本身就是索引文件。
MyISAM索引文件和数据文件是分离的,索引文件仅仅保存数据记录的地址
而InnoDB:表数据本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录,这个索引的key是数据表的主键。所以,InnoDB表数据文件本身就是主索引。


叶子结点包含了完整的数据记录,这种索引叫做聚集索引。因为InnoDB的数据本身要按主键聚集。所以,InnoDB要求表必须有主键(MyISAM可以没有),若没有显示指定,则会自动选择一个可以唯一标识数据记录的列作为主键,若不存再这种列,则会生成一个隐含字段作为主键。(使用自增字段作为主键时一个很好的选择)

第二个不同:InnoDB的辅助索引data域存储相应记录主键的值而不是地址。也就是说,InnoDB的所有辅助索引都引用主键作为data域。

下图为辅助索引:

聚簇索引这种实现方式使得按主键的搜索十分高效。

但是辅助索引搜索需要检查两遍索引:首先检查辅助索引获得主键,然后根据主键到主索引中检索获得的记录。这也就是为什么:为什么不建议使用过长的字段作为主键。因为,所有辅助索引变得过大。

这里涉及到一道面试题:

InnoDB索引种类:

主键索引称为聚集索引
非主键索引称为非聚集索引或者辅助索引
辅助索引:一个非主键索引对应一个辅助索引,一个表可以有多个辅助索引,辅助索引域聚集索引的区别在于叶节点。

辅助索引的叶节点数据页存的不是真实记录,而是对于记录的主键。这种辅助索引名称的由来,通过这个索引,仅仅能查到某些记录的主键,这些主键去查主键索引,得到相应的记录。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/176880.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

五个简单常用的系统命令

一、文件扫描修复 以管理员身份进入命令提示符,输入Sfc空格/scannow 二、使用Check disk命令检查并修复磁盘错误 1、开机时连续不断的点击F11键,选择(疑难解答)-选择(高级选项)-选择(命令提示…

virtualbox运行Ubuntu系统

virtualbox安装 下载virtualbox VirtualBox 7.0.6版本下载 安装virtualbox 点击执行VirtualBox-7.0.6-155176-Win.exe即可, 直接点击"下一步" 直到 “完成” 导入以有的ova虚拟机文件 1)点击导入 2)选择下载的ova文件 3&a…

GD32F4——定时器(TIMERx)

一、概述 定时器的主要功能是用来计时,时间到达之后可以产生中断,提醒计时时间到,然后可以在中断函数中去执行功能。 GD32F450ZGT6共14个定时器,分别为 (1)高级定时器(TIMERx,x0,…

LightGBM介绍

LightGBM介绍 GBDT是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好,不易过拟合等优点。GBDT不仅在工业界应用广泛,通常被应用于多分类、点…

【ONE·C || 数据存储】

总言 C语言:数据存储相关介绍。 文章目录总言1、基本数据类型介绍1.1、整体介绍1.2、各数据类型分别说明(整型、浮点型、构造、指针、空)2、整型在内存中的存储2.1、原码、反码、补码2.1.1、总体介绍2.1.2、char、short类型在内存中的存储范围…

顺序表的具体使用方法.数据解构(二)

前言 提示:文本为数据解构(一)后续补充文: 本文具体讲解顺序表的具体使用方法 提示:以下是本篇文 系列文章目录 第一章 数据解构(一) 文章目录 前言 系列文章目录 一、静态的使用方式 二、动态的使用方式 1.定义一个结构体 2.初始化 3.扩容…

【ArcGIS微课1000例】0060:ArcGIS打开las格式点云数据的方法

文章目录 1. 使用上下文菜单创建 LAS 数据集2. 使用地理处理工具创建 LAS 数据集3. 显示LAS数据集LAS 数据集是位于文件夹中的独立文件,并且引用 LAS 格式的激光雷达数据和用于定义表面特征的可选表面约束要素。ArcGIS中,可使用创建 LAS 数据集工具或 ArcCatalog 中文件夹的上…

23种设计模式(二十)——责任链模式【数据结构】

文章目录 意图什么时候使用责任链真实世界类比责任链模式的实现责任链模式的优缺点亦称:职责链模式、命令链、CoR、Chain of Command、Chain of Responsibility 意图 将链中的每一个节点看作是一个对象,每个节点处理的请求不同,且内部自动维护一个下一节点对象。当一个请求…

【OpenGL学习】camera and camera control

摄像机 游戏中的相机可以理解为与现实中的相机类似,可以捕获对应的游戏画面。Camera在游戏引擎中一般也会展示为现实中相机的模型,使用时有两种实现方式,一种以组件形式挂载在Character上,一种则是单独存在。通常来讲&#xff0c…

Flutter 基础-下

一、shared_preferences shared_preferences 是一个本地数据缓存库(类似 AsyncStorage) https://pub.dev/packages/shared_preferences 使用步骤 在 pubsepc.yaml 中添加 shared_preferences 依赖安装依赖(pub get | flutter packages get |…

Git使用Merge和Rebase区别及心得技巧

git rebase命令常常因为江湖上关于它是一种Git魔法命令的名声而导致Git新手对它敬而远之,但是事实上如果一个团队能够正确使用的话,它确实可以让生活变得更简单。在这篇文章中我们会比较git rebase和经常与之相提并论的git merge命令,并且在真…

【回望2022,走向2023】一个双非二本非科班的学生的旅途

目录 1.自我介绍 2.高考与暑假 梦想 幻灭 决心 暑假 3.大一上学期 4.奋进之路 5.展望未来 1.自我介绍 我是一个双非本科的大一学生,在2023年的新春之际,借着CSDN的这次年度总结活动,来好好回顾一下,2022这个平凡却又不乏…

css 2D转换

文章目录一、什么是2D转换二、rotate() 方法(旋转)三、translate() 方法(位移)四、scale() 方法(缩放)五、skew() 方法 (倾斜)一、什么是2D转换 在二维空间下对元素进行移动、缩放、…

面试官问我有没有分布式系统开发经验,我一脸懵圈…

目录 从单块系统说起团队越来越大,业务越来越复杂分布式出现:庞大系统分而治之分布式系统所带来的技术问题一句话总结:什么是分布式系统设计和开发经验补充说明:中间件系统及大数据系统 前言 现在有很多Java技术方向的同学在找工…

深度学习网络---YOLO系列

深度学习网络—YOLO yolov1(仅适用一个卷积神经网络端到端地实现检测物体的目的) 首先将输入图片resize到448448,然后送入CNN网络,最后处理预测的结果得到检测的目标;yolov1的具体思想是将全图划分为SS的格子&#xf…

结构型模式-外观模式

1.概述 有些人可能炒过股票,但其实大部分人都不太懂,这种没有足够了解证券知识的情况下做股票是很容易亏钱的,刚开始炒股肯定都会想,如果有个懂行的帮帮手就好,其实基金就是个好帮手,支付宝里就有许多的基…

智能的本质不是数据算法算力和知识

编者按:人机之间未解决的大部分问题不是统计问题,而是统计概率分布外的问题。人是自然的,又不是自然的,还是社会的,人类和机器都可以作为认知的载体,但认知的性质是不同的,一个是生命的认知&…

GA6-BGSM/GPRS模块介绍

GA6-BGSM/GPRS模块简介GA6-B是一个4频的GSM/GPRS模块,工作的频段为:EGSM 900MHz、 GSM850MHz和DCS1800, PCS1900。GA6-B支持GPRS multi-slot class 10/ class 8(可选)和 GPRS 编码格式CS-1, CS-2, CS-3 and CS-4。模块的尺寸只有2…

SelectPdf for .NET 22.0 Crack

SelectPdf for .NET 是一个专业的 PDF 库,可用于创建、编写、编辑、处理和读取 PDF 文件,而无需在 .NET 应用程序中使用任何外部依赖项。使用此 .NET PDF 库,您可以实现丰富的功能,从头开始创建 PDF 文件或完全通过 C#/VB.NET 处理…

python数据结构——栈、队列

python数据结构——栈、队列、树和算法栈栈的操作队列单端队列操作双端队列操作链表或者顺序表的使用场景: 当数据需要后进先出,来构建栈或者先进先出,构建队列时 栈或者队列之内的数据可以以顺序表或者链表的方式进行存储 python内置的数据…