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数据存储方式如下图:
我的面试宝典:一线互联网大厂Java核心面试题库
以下是我个人的一些做法,希望可以给各位提供一些帮助:
整理了很长一段时间,拿来复习面试刷题非常合适,其中包括了Java基础、异常、集合、并发编程、JVM、Spring全家桶、MyBatis、Redis、数据库、中间件MQ、Dubbo、Linux、Tomcat、ZooKeeper、Netty等等,且还会持续的更新…可star一下!
283页的Java进阶核心pdf文档
Java部分:Java基础,集合,并发,多线程,JVM,设计模式
数据结构算法:Java算法,数据结构
开源框架部分:Spring,MyBatis,MVC,netty,tomcat
分布式部分:架构设计,Redis缓存,Zookeeper,kafka,RabbitMQ,负载均衡等
微服务部分:SpringBoot,SpringCloud,Dubbo,Docker
还有源码相关的阅读学习
0983188)]
还有源码相关的阅读学习
[外链图片转存中…(img-DwwMMFgo-1714300983189)]