0.什么是存储引擎?
在存储数据的同时,还要组织数据的存储结构,而这些数据的组织结构就是由存储引擎决定的。即存储引擎的作用就是规定了数据存储时的存储结构。
那么,问题来了,存储引擎是形容数据库的,还是形容表的??
答案是表啊!
表和索引信息存储在磁盘上,一般来说MySQL的各个数据库,存储在一个叫做data文件夹下 ,该文件夹内容对应该数据库里的所有表。
1.MyISAM
1.1物理存储结构
frm文件:表结构相关信息
myd文件:表的数据
myi文件:表的索引
索引文件和数据文件是分开存放的,是非聚集索引,也称非聚簇索引,稀疏索引。
1.2数据定位
B+树,叶子节点存放的是索引和索引所在行的文件地址
1.首先看where查询的查询条件是否走索引字段
2.如果走了就在myi文件找到某个索引叶子节点,存储的是表的该行记录的磁盘文件地址
3.根据这个地址去myd文件里查找到data并加载
2.InnoDB(大部分)
2.1物理存储结构
frm文件:表结构相关信息
ibd文件:表的索引和数据
索引文件和数据文件是存放在一个文件中的,是聚集索引,也称聚簇索引。
2.2数据定位
B+树,叶子节点存放的是索引所在行的其他字段。叶子节点就包含了完整的数据记录。
双向链表
2.3为什么InnoDB表必须要有主键,并且推荐使用整型的自增主键?
(1)为什么必须要有主键??
1.必须要有主键索引来组织表的数据
2.没有主键,MySQL会自动从第一列开始找,找到一列不重复的字段作为主键索引
3.没有重复的列,MySQL会在底层帮我们建一列隐藏列,确保唯一性。最终会用隐藏列来组织整张表所有数据的b+树。
推荐使用InnoDB一定要主键,否则就交给MySQL底层维护,加重了MySQL性能负担
(2)推荐使用整型??
B+树有多次比较,整形比较大小快,uuid逐个字符转化为asc码比较大小。
1.整型比较效率优于uuid
2.整型占用的字节少(对性能要求比较高的会把mysql索引放在SSD固态硬盘上,占磁盘小减少资源消耗)
(3)自增??
b+树会把索引列 排序。如果不是自增,是乱序的,维护b+树会分裂或者平衡,特别消耗性能。。