0.什么是存储引擎?

在存储数据的同时,还要组织数据的存储结构,而这些数据的组织结构就是由存储引擎决定的。即存储引擎的作用就是规定了数据存储时的存储结构。

那么,问题来了,存储引擎是形容数据库的,还是形容表的??

答案是表啊!

表和索引信息存储在磁盘上,一般来说MySQL的各个数据库,存储在一个叫做data文件夹下 ,该文件夹内容对应该数据库里的所有表。

1.MyISAM

1.1物理存储结构

frm文件:表结构相关信息

myd文件:表的数据

myi文件:表的索引

索引文件和数据文件是分开存放的,是非聚集索引,也称非聚簇索引,稀疏索引。

硬盘文件索引数据库 文件索引表存储在哪里_主键

1.2数据定位

硬盘文件索引数据库 文件索引表存储在哪里_数据_02

B+树,叶子节点存放的是索引和索引所在行的文件地址

 

1.首先看where查询的查询条件是否走索引字段

2.如果走了就在myi文件找到某个索引叶子节点,存储的是表的该行记录的磁盘文件地址

3.根据这个地址去myd文件里查找到data并加载

2.InnoDB(大部分)

2.1物理存储结构

frm文件:表结构相关信息

ibd文件:表的索引和数据

索引文件和数据文件是存放在一个文件中的,是聚集索引,也称聚簇索引。

硬盘文件索引数据库 文件索引表存储在哪里_主键_03

2.2数据定位

硬盘文件索引数据库 文件索引表存储在哪里_数据_04

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+树会分裂或者平衡,特别消耗性能。。