面试官:InnoDB 和 MyISAM 的数据分布是什么样的?

【Agent从入门到实践】40 容错优化:异常处理、重试机制、降级策略 各位小伙伴,咱们的多Agent框架一路优化到现在,决策快、执行效率高、资源用得省,看似啥都行,但只要一遇到网络波动、工具故障、数据异常调用web_search工具时网络超时,整个检索任务直接失败,写作Agent没数据可用向量库连接异常,向量检索直接崩掉,依赖检索结果的Agent全趴窝单个Agent执行出错,整个并行任务流程直接中断,前功尽弃高并发下部分工具调用失败,框架没有备用方案,只能返回任务失败说白了,咱们之前的框架只有正常执行逻辑,没有异常兜底逻辑。 阅读详情

推荐阅读:

建表及插入数据

聚簇索引和非聚簇索引的数据分布有区别,以及对应的主键索引和二级索引的数据分布也有区别。下面我们看 InnoDB 和 MyISAM 是如何存储下面这个表:

DROP TABLE IF EXISTS `test`; -- 若表已存在,则删除
CREATE TABLE test (
    id  INT NOT  NULL,
    num int NOT  NULL,
    tag CHAR(12) NOT NULL,

    PRIMARY KEY(id), -- 主键索引
    KEY(num)         -- 辅助索引
    -- 尝试不同的引擎 MyISAM InnoDB
) ENGINE=MyISAM;
复制代码

然后插入下面的数据,id从1-9,故意把插入顺序打乱,tag代表插入顺序

INSERT test(id, num, tag) VALUES(7, 1,  'no.1');
INSERT test(id, num, tag) VALUES(5, 19, 'no.2');
INSERT test(id, num, tag) VALUES(6, 7,  'no.3');
INSERT test(id, num, tag) VALUES(9, 5,  'no.4');
INSERT test(id, num, tag) VALUES(3, 13, 'no.5');
INSERT test(id, num, tag) VALUES(4, 17, 'no.6');
INSERT test(id, num, tag) VALUES(2, 3,  'no.7');
INSERT test(id, num, tag) VALUES(8, 23, 'no.8');
INSERT test(id, num, tag) VALUES(1, 11, 'no.9');
复制代码
MyISAM的数据存储

MyISAM按照数据插入的顺序存储在磁盘上,我们假设第一行数据在数据库表文件中的偏移位置是1,以此类推。 如下图

现在我们验证一下,使用 SELECT * FROM test; 扫描全表(SELECT * 不会使用任何索引,可以用 explain 实际观察下),输出的顺序正是我们sql插入的顺序,大家可以调整sql的顺序再次插入,观察输出顺序。

搞清楚了MyISAM的数据存储方式,再来看下主键索引的存储。我们假设每个磁盘块只能存储两个节点数据,MyISAM的主键分布如下图:

其实MyISAM的二级索引和主键索引并无区别,只是名称不同罢了,二级索引key(num)分布如下图:

二级索引子节点也只存储了索引列(num)和文件的偏移量(P),但可以看出num是有序的,这在范围查找(比如:where num > 3)是非常有利的,但文件的偏移量并没有规律,当需要回表查询其他字段,可能会导致多次随机I/O。

当对增加数据时MyISAM直接添加到文件尾部,不需要移动其他数据,而且更新主键时,也不会导致其他行数据移动,但它不支持行级锁,修改时直接锁表。若不需要事务支持,对读多写少的场景可以考虑MyISAM引擎,但不要默认使用MyISAM引擎。

InnoDB的数据存储

InnoDB支持聚簇索引,所以使用非常不同的方式存储同样的数据。InnoDB数据存储方式如下图:

注意整个树和MyISAM的主键索引非常类似,唯一的区别是叶子节点,InnoDB的叶子节点存储了整个行数据(id、num、tag),而不是只有索引。聚簇索引“就是”整个表,而不像MyISAM那样需要单独的行存储文件。当更新主键id时,可能会导致数据行移动,因为索引和数据是存储在一起的。若主键id是乱序写入的,InnoDB不得不做页分裂操作时,至少会导致修改三个页(分裂产生的两个页,以及他们的父节点页面),而不是一个页,这和MyISAM新增数据时添加到文件尾部很不一样。所以使用InnoDB引擎尽可能的按主键顺序插入数据。

InnoDB的二级索引和聚簇索引也不一样。InnoDB二级索引的叶子节点中存储的不是行数据的“偏移量”,而是主键值。这意味着通过二级索引查找行数据,存储引擎需要找到二级索引的叶子节点获得对应的主键值,然后根据这个值去聚簇索引中查找到对应的行数据。这里做了重复的工作:两次B-Tree查找,而不是一次。这样的策略减少了当出现行移动或者数据页分裂时二级索引的维护工作。二级索引的数据分布如下图:

如果没有定义主键,InnoDB会选择一个唯一的非空索引代替。如果没有这样的索引InnoDB会隐式的定义一个主键作为聚簇索引。选择主键最好是自增id,如果采用字符串当做主键,不仅仅会增加聚簇索引的大小,也会增加二级索引的大小(二级索引叶子节点包含主键值),并且字符串匹配需要一个个字符判断,更加降低索引的查找性能。当然某些场景使用字符串作为主键带来的优势要比这些损失更有利,需要根据场景具体评估。

【WorkBuddy专栏09】WorkBuddy多模态能力深度揭秘 【WorkBuddy专栏09】AI不止会聊天——WorkBuddy多模态能力深度揭秘 阅读详情

相关推荐

数字孪生实战:如何用Unity3D为工厂设备快速搭建可视化孪生体(附GitHub源码)

本文详细介绍了如何利用Unity3D游戏引擎为工厂设备快速构建可视化数字孪生体。通过实战案例,阐述了从3D模型导入、MQTT实时数据接入,到振动、温度等关键参数可视化呈现的完整流程。文章旨在为智能制造和工业物联网开发者提供一套灵活、低成本的技术方案,并附有完整的GitHub源码,助力实现设备状态的直观监控与预测性维护。

weixin_29184075的博客 477

【MySQL】InnoDB和MyISAM区别详解(MySQL专栏启动)

文本适合解决:你们公司用什么存储引擎?InnoDB和MyISAM 区别?为什么选择InnoDB?什么事聚簇索引什么是非聚簇索引?InnoDB如何存储数据?如何选择存储引擎?InnoDB为什么推荐用自增ID做主键?等类似的问题。

小明的Java问道之路 4966

抽象代数学习笔记(抽象代数的历史、运算)

1. 抽象代数历史 对于五次及以上的代数方程是否存在根式解这个问题,欧拉、拉格朗日、高斯等数学家都没得到答案,但是他们得出五次及以上的代数方程组不存在根式解的结论。19世纪初,阿贝尔提出五次及以上的代数方程不存在根式解,并找出一类特殊的五次及以上的代数方程可以用根式解表示出来。另外一个年轻的数学家伽罗华...

huangzhpei的博客 3668

InnoDB 和 MyISAM 的数据分布是什么样的?

推荐阅读: 这套Github上40K+star学习笔记,可以帮你搞定95%以上的Java面试 毫不夸张的说,这份SpringBoot学习指南能解决你遇到的98%的问题 给跪了!这套万人期待的 SQL 成神之路PDF,终于开源了 建表及插入数据 聚簇索引和非聚簇索引的数据分布有区别,以及对应的主键索引和二级索引的数据分布也有区别。下面我们看 InnoDB 和 MyISAM 是如何存储下面这个表: DROP TABLE IF EXISTS `test`; -- 若表已存在,则删除 CREATE

资料免费分享,点击名片 239

电子结构设计(EMD)十年知识总结

客官,你的面相是做结构设计的奇才~1. 材料选择【一出手的0.1s就败了】2. 钣金件设计【折来折去有啥难】3. 塑胶件设计【看着好复杂】4. 型材件设计【凭啥不让我设计】5. 电子结构(PCBA)设计【静电肿么要我背锅】6. 包装设计【要的就是金玉其外,败絮其中】7. 外观(工业)设计【好不好看,谁说了算】8. 标签设计【】9. 标准件选择【一个螺丝难倒英雄汉/提起螺丝,英雄气短】10. 计算仿...

wfeng86的博客 1571

RcisTarget实战:从差异基因到转录因子调控网络的完整分析流程(附代码)

本文详细介绍了RcisTarget工具在转录因子调控网络分析中的完整流程,从差异基因到motif富集分析,再到结果可视化与生物学解读。通过实战代码演示,帮助研究者掌握这一强大的R包应用,揭示基因表达背后的调控机制,特别适用于基因组学和生物信息学研究。

weixin_29214199的博客 228

MySQL(二):InnoDB和MyISAM

即:InnoDB 如果添加其他辅助索引,辅助索引查询就需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也相应都会很大。(比如表中有id(主键),name,age 字段,我们创建一个主键索引,再来创建一个name索引,层级关系如下图所示)InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的;MyISAM是非聚集索引,它也是使用B+Tree作为索引结构,但是索引和数据文件是分离的,索引保存的是数据文件的指针。

qq_43398345的博客 675

OCC WebGL案例编译实战:从FreeType配置到静态库生成

本文详细记录了将OCC(Open CASCADE Technology)3D图形库编译为WebAssembly(Wasm)并在浏览器中通过WebGL渲染的实战过程。重点解决了FreeType库的交叉编译配置、OCC核心库的裁剪与静态库生成,以及WebGL样例项目的CMake改造等关键步骤,为开发者提供了从环境搭建到最终集成的完整指南。

weixin_28831461的博客 317

Mysql常见面试题总结

1、数据库设计的三范式: 第一范式:1NF是对属性的原子性约束,要求属性具有原子性,不可再分解;第二范式:2NF是对记录的惟一性约束,要求记录有惟一标识,即实体的惟一性;第三范式:3NF是对字段冗余性的约束,即任何字段不能由其他字段派生出来,它要求字段没有冗余。 范式化设计优缺点: 优点:可以尽量得减少数据冗余,使得更新快,体积小 缺点:对于查询需要多个表进行关联,减少写得效率增加读得效率,更难进行索引优化 2、Mysql 中有哪几种锁 - MyISAM支持表锁,InnoDB支持表锁和行锁,默认为行锁

暮云归@技术人生 2672

【WRF-Urban运行】WRF-SLUCM耦合建模参数设置及模拟运行

WRF-SLUCM耦合建模参数设置及模拟运行

WW、forever的博客 1724

27、VXLAN BGP EVPN网络的自动化部署与运维管理

本文深入探讨了VXLAN BGP EVPN网络从初始配置到运维管理的全生命周期自动化流程,涵盖Day-0设备自动上线、Day-0.5增量变更与连接验证、Day-1覆盖服务配置与计算集成,以及Day-2监控与故障排查。详细介绍了推送与拉取两种配置模型、主流工具如Cisco VTS、NFM、DCNM的功能特点,以及开源自动化工具的应用。通过流程图和命令示例,系统展示了MAC/IP学习、BGP通告和VXLAN封装的验证方法,为构建高效、可扩展的数据中心网络提供了全面的技术指导。

banana的博客 81

主键索引和辅助索引的区别(MyISAM和InnoDB)

1. MyISAM索引实现: 概述: MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引在结构上没有任何区别,只是主索引要求key是唯一的,而辅助索引的key可以重复。 1)主键索引: MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。 下图是MyISAM主键索引的原理图: 这里设表一共有三列,假设我们以Col1为主键,图myisam1是一个MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件仅仅保存数

qq_42533216的博客 956

Vue + ECharts:从零构建智慧农业数据监控大屏(附完整源码)」 「超实用!一步步实现智慧农业大屏,完整代码+讲解」 「前端新手友好:Vue + ECharts 打造炫酷农业数据大屏」 「

Vue + ECharts:从零构建智慧农业数据监控大屏(附完整源码)」 「超实用!一步步实现智慧农业大屏,完整代码+讲解」 「前端新手友好:Vue + ECharts 打造炫酷农业数据大屏」 「前端可视化项目实战:智慧农业监控大屏开发详解」 「农作物可视化监控:用 Vue 和 ECharts 构建大屏应用」 「从零开始开发一个智慧农业数据大屏(代码+图表展示)」 「前端新手也能实现!智慧农业监控大屏开发教程」 「用 Vue 和 ECharts 搭建动态数据大屏:详细图文教程」 「学习前端大屏开发:

sky10100100的博客 1535

InnoDB 和 MyISAM 的数据分布是什么样的?(1)

虽然面试套路众多,但对于技术面试来说,主要还是考察一个人的技术能力和沟通能力。不同类型的面试官根据自身的理解问的问题也不尽相同,没有规律可循。上面提到的关于这些JAVA基础、三大框架、项目经验、并发编程、JVM及调优、网络、设计模式、spring+mybatis源码解读、Mysql调优、分布式监控、消息队列、分布式存储等等面试题笔记及资料。

2401_84584324的博客 899

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

2024年最新InnoDB-和-MyISAM-的数据分布是什么样的?,2024年最新12道web前端高级面试题目

如果你已经下定决心要转行做编程行业,在最开始的时候就要对自己的学习有一个基本的规划,还要对这个行业的技术需求有一个基本的了解。有一个已就业为目的的学习目标,然后为之努力,坚持到底。如果你有幸看到这篇文章,希望对你有所帮助,祝你转行成功。开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】复制代码。

2401_84620231的博客 877

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Java最全InnoDB 和 MyISAM 的数据分布是什么样的?,美团阿里Java程序员晒工资被围观

上述知识点,囊括了目前互联网企业的主流应用技术以及能让你成为“香饽饽”的高级架构知识,每个笔记里面几乎都带有实战内容。很多人担心学了容易忘,这里教你一个方法,那就是重复学习。打个比方,假如你正在学习 spring 注解,突然发现了一个注解@Aspect,不知道干什么用的,你可能会去查看源码或者通过博客学习,花了半小时终于弄懂了,下次又看到@Aspect 了,你有点郁闷了,上次好像在哪哪哪学习,你快速打开网页花了五分钟又学会了。从半小时和五分钟的对比中可以发现多学一次就离真正掌握知识又近了一步。

2401_84584522的博客 771

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

MySQL面试核心35问:从InnoDB到性能调优全解析

关系型数据库作为数据存储的核心组件,其底层原理和优化策略是开发者必须掌握的关键技术。MySQL作为最流行的开源关系型数据库,其InnoDB存储引擎通过B+树索引、MVCC多版本并发控制等机制实现高性能事务处理。在数据库优化领域,索引设计直接影响查询效率,联合索引的最左前缀原则、索引选择性计算等都是工程实践中的高频考点。事务隔离级别与锁机制保障了数据一致性,但不当使用可能导致死锁或性能问题。通过EXPLAIN分析执行计划、监控慢查询日志等手段可以进行系统级调优。本文聚焦MySQL面试中的35个核心知识点,涵盖

weixin_34110749的博客 301

面试官:要不简单聊一下你对MySQL索引的理解?

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33860737的博客 815

MySQL引擎分类与选择、SQL更新底层实现、分库分表、读写分离、主从复制 - 面试实战

好了,今天的面试就到这里,我们会尽快通知你结果,请回家等消息。期待您的好消息。问题详细解答MySQL常见的存储引擎有哪些?它们各自的特点是什么?如何根据业务需求选择合适的引擎?InnoDB支持事务处理,具备行级锁和外键约束功能,适合高并发场景;MyISAM不支持事务,但查询速度较快,适用于读密集型应用。InnoDB和MyISAM在锁机制上有什么区别?InnoDB使用行级锁,能够更好地支持并发操作;MyISAM则采用表级锁,一旦某个线程对表加锁,其他线程无法访问该表。如何选择适合的存储引擎?

南客先生的博客 889

面试官:聊一下你对MySQL索引的理解?

Java面试笔试面经、Java技术每天学习一点Java面试关注不迷路作者:浪人~来源:https://www.cnblogs.com/liqiangchnMySQL索引?这玩意儿还能简单...

java面试笔试 383

mysql内部架构_Mysql架构与内部模块-第三章

前言接上文,本篇文章专门简述Mysql存储引擎,内容繁多,如果你只需知道每种存储引擎的适用场景,可以直接查看本文最后列出的适用场景部分。正文:Mysql存储引擎作为本系列文章中相对重要的一环,也是相关领域面试官问的比较多的一部分,能够掌握不同的存储引擎的区别,可以让你在工作中有更加突出的表现。存储引擎首先其实它是一个进程,它能够决定你的数据的存储方式,管理方式,然后提供一些特性。先带着一个问题进入...

weixin_35367646的博客 185

MySQL高阶——索引设计的推演

本篇讲述MySQL非常重要的知识点——索引,不过这篇主要讲MySQL索引的底层设计推演过程。希望能给大家的学习和面试带来帮助~

IDEA操作工的博客 1264

mysql内部的结构图_Mysql架构与内部模块-第三章

前言接上文,本篇文章专门简述Mysql存储引擎,内容繁多,如果你只需知道每种存储引擎的适用场景,可以直接查看本文最后列出的适用场景部分。正文:Mysql存储引擎作为本系列文章中相对重要的一环,也是相关领域面试官问的比较多的一部分,能够掌握不同的存储引擎的区别,可以让你在工作中有更加突出的表现。存储引擎首先其实它是一个进程,它能够决定你的数据的存储方式,管理方式,然后提供一些特性。先带着一个问题进入...

weixin_28814119的博客 168

面试官:mysql 索引原理

索引原理 MySQL官方对索引定义:是存储引擎用于快速查找记录的一种数据结构。需要额外开辟空间和数据维护工作。 索引是物理数据页存储,在数据文件中(InnoDB,ibd文件),利用数据页(page)存储。 索引可以加快检索速度,但是同时也会降低增删改操作速度,索引维护需要代价。 B+Tree结构 MySQL数据库索引采用的是B+Tree结构,在B-Tree结构上做了优化改造。 B-Tree结构 索引值和data数据分布在整棵树结构中 每个节点可以存放多个索引值及对应的data数据 树节点中的多个索引

Quasimodo24的博客 357

面试官:简单聊一下你对MySQL索引的理解吧

长按识别下方二维码,即可"关注"公众号每天早晨,干货准时奉上!本文作者:我又不乱来链接:cnblogs.com/liqiangchn/p...

Java学习之道 2383

面试官:要不简单聊一下你对MySQL索引的理解?【转】

面试官:要不简单聊一下你对MySQL索引的理解?【转】 JAVA技术之家 7月4日 作者:liqiangchn 原文链接: https://www.cnblogs.com/liqiangchn/p/9060521.html MySQL索引?这玩意儿还能简单聊?明显是在挖坑,幸好老夫早有准备,切听我一一道来。 一、索引是什么? 索引是帮助MySQL高效获取数据的数据结构。 二、索引能干什么? 索引...

xiang__dao的博客 135
上一篇: 从传统小公司逆袭京东,拿下年薪30W+的offer,这些刷题神器功不可没!
下一篇: 链表反转的这两种实现方法,后一种击败了100%的用户!
「已注销」
博客等级 码龄6年 36粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值