Mysql中的两种储存引擎

//存储引擎这个概念是用来形容每张表的;

1.MylSAM存储引擎:

Mysql中的两种储存引擎
使用MylSAM存储表,在文件中可以发现该表有三个文件组成:
Mysql中的两种储存引擎
其中.frm结尾的用来记录表的结构;
.MYD结尾的用来存储表中数据行的记录;
.MYI结尾的存储表中的索引字段(B+树结构);

查找的过程:
eg: Col1=49
1.首先Col1是索引字段,从MYI文件中查找该索引是否存在;
2.若存在,则按照从B+树的结构进行查找,找到该索引对应的磁盘文件地址;
3.按照磁盘文件地址一次性在MYD文件中定位到所要查询的数据;
Mysql中的两种储存引擎

2.InnoDB存储引擎:

Mysql中的两种储存引擎
使用InnoDB存储表,在文件中可以发现该表有两个文件组成:
Mysql中的两种储存引擎
其中.frm结尾的用来记录表的结构;
.ibd结尾的用来存储表中数据文件和索引文件的合并;
Mysql中的两种储存引擎

InnoDB中叶子节点包含了整个数据内容,这样的称为聚集索引,反之称为非聚集索引;

问题1:为什么InnoDB表必须要有主键,且推荐使用整型的自增主键?

1.因为表本身使用B+树来存储索引的,所以必须要有主键;(若建InnoDB表时没有主动的创建主键,则Mysql会自动的选择数据表中某个不重复的一列作为主键,若找不到唯一可以作为索引的一列,则会自动生成一列类似于rowId的一列自增数据作为主键)
2.在查找的过程中,需要不断地进行比对,采用整型可以加快比较的速度,若表中使用UUID主键,则显而易见 1<2 的比较 比 abc和ab11 两个字符串之间的比较(需要转换成ASCII,且需要一位一位的比较,很麻烦) 更为简单;
从存储空间来看,整型也比UUID类型的更省空间,节约资源;
3.如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页;
4.如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置,此时MySQL不得不为了将新记录插到合适位置而移动数据,甚至目标页面可能已经被回写到磁盘上而从缓存中清掉,此时又要从磁盘上读回来,这增加了很多开销,同时频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构;