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

聚簇索引和非聚簇索引的数据分布有区别,以及对应的主键索引和二级索引的数据分布也有区别。下面我们看 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引擎。

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

### 索引的数据结构及其对存储的影响 #### 1. 索引的基本概念 索引是一种特殊的数据结构,用于加速数据库查询操作。它通过为表中的某些列创建额外的结构来实现快速定位数据的功能[^2]。索引可以显著提高查询性能,但同时也会增加存储开销。 #### 2. 常见的索引数据结构 在 MySQL 中,主要使用 B+ 树作为索引的数据结构。以下是不同存储引擎中索引的具体实现: - **MyISAM 存储引擎**: MyISAM 使用非聚集索引(Non-Clustered Index),其索引文件数据文件是分开存储的。叶子节点不存储实际的数据行,而是存储指向数据行的指针[^1]。这种设计使得 MyISAM 的索引相对较小,但由于需要额外的指针跳转,可能会导致更多的磁盘 I/O 操作。 - **InnoDB 存储引擎**: InnoDB 使用聚集索引(Clustered Index),数据文件索引文件是同一个物理结构。主键索引直接决定了数据的存储顺序,因此主键索引的叶子节点存储了完整的数据行。此外,InnoDB 还支持非聚集索引(Secondary Index),其叶子节点存储的是主键值,而不是数据行的物理地址。 #### 3. 索引对存储的影响 索引的存储特性主要取决于以下几个因素: - **索引类型**: 聚集索引非聚集索引对存储的影响不同。聚集索引将数据索引结合在一起存储,减少了额外的指针开销,但主键索引的大小直接影响整个表的存储需求。非聚集索引则需要额外的空间来存储索引树结构以及指向数据行的引用[^2]。 - **索引列的选择性**: 索引列的选择性越高,索引的效率越高,同时存储开销也越小。如果索引列的选择性较低(即重复值较多),则会导致大量的冗余条目,从而增加存储需求[^2]。 - **索引深度**: B+ 树的深度会影响存储效率。较深的树结构会导致更多的中间节点存储,但通常可以通过增加每个节点的容量(如增大页大小)来优化存储效率[^4]。 #### 4. 示例代码 以下是一个创建索引的示例,展示了如何在 MySQL 中为表的不同列创建索引: ```sql -- 创建单列索引 CREATE INDEX idx_employee_name ON employees (name); -- 创建复合索引 CREATE INDEX idx_employee_department ON employees (department_id, name); ``` #### 5. 其他数据结构的比较 除了 B+ 树,还有其他数据结构可以用于实现索引,但它们各有优缺点: - **Hash 索引**: Hash 索引适用于等值查询,能够提供极快的查询速度,但在范围查询或排序操作中表现较差。此外,Hash 索引无法利用索引覆盖(Index Covering)[^3]。 - **B 树**: B 树是一种平衡树结构,适合范围查询,但相比 B+ 树,B 树的磁盘预读效率较低,因为其节点中包含实际数据,而非仅包含指针[^4]。 - **AVL 树**: AVL 树是一种自平衡二叉搜索树,理论上可以用于实现索引,但由于其深度较大且不支持高效的磁盘预读,因此在数据库系统中很少使用[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值