昨个和一家面试官进行面试工作,面试官样子应该是项目经理级别,问到我一个问题:谈下MySql存储引擎的理解,例如:InnoDB?说实话,我蒙了,一直都是问Java相关的底层数据结构什么的,突然来个这个,学识浅薄。结束后赶紧补课:

 

首先就先说下什么是存储引擎:

存储引擎就是存储数据,建立索引,更新查询数据等技术的实现方式。

存储引擎是基于表的,而不是基于库的。所以存储引擎也可以被称作为“表类型”

对于其他数据库的存储引擎:Oracle,sqlServer等数据库只有一种存储引擎。MySQL提供了插件式的存储引擎架构。所以MySQL是存在多种存储引擎的,可以根据需要使用相应引擎,或者编写存储引擎。

 

如何知道有哪些存储引擎呢?是可以通过命令符来查询的:

使用MySQL的可视化工具或者使用命令行界面来操作:输入命令:show engines;

MySql之多种存储引擎分析和理解_mysql

博主的Mysql数据库版本是5.7.21的,可以看到所包含的默认存储引擎为InnoDB,还有其他存储引擎:例如MRG_MYISAM、CSV、MYISAM、MEMORY、BLACKOLE、CSV、ARCHIVE、PERFORMANCE_SCHEMA、FEDERATED等。

这里是会直接显示默认的存储引擎,当然可以通过命令行来查看

查看当前默认使用的存储引擎,命令:show variables like 'table_type';

 

存储引擎1:InnoDB

从MySQL5.5.8,InnoDB成为MySQL默认的存储引擎。MySQL从3.23.34a开始支持InnoDB。

InnoDB支持事务,主要面向OLTP数据库应用。支持行锁,支持外键,并支持类似于Oracle的行锁定读,即默认读取操作不会产生锁。

 

InnoDB存储引擎中支持自动增长列AUTO_INCREMENT自动增长列的值不能为空,且值必须唯一,且必须为主键。在执行插入操作时,若指定自动增长,列的值,或自动增长列的值为0或NULL,则插入的值为自动增长后的值。

若插入任意值,该值在该列中没有出现过,则可以直接插入。

InnoDB存储引擎中,创建的表的结构存储于.frm文件中。数据和索引在innodb_data_home和innodb_data_path表空间中。

 

对于表的数据存储,InnoDB存储引擎采用了聚集的方式,每张表的存储都是按照主键顺序进行存放。若

若没有显示在表定义时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键。

InnoDB支持外键。外键所在的表为子表,外键依赖的表为父表。父表中被主表外键支持的字段必须为主键。当删除、更新浮标的某条信息时,子表也必须要有相应的改变。

 

InnoDB通过多版本并发控制(MVCC)来获得高高并发性,并实现了SQL标准的4中隔离机制,默认为REPEATABLE级别。同时使用一种被称为next-key locking的策略来避免幻读。InnoDB还提供了插入缓冲、二次写、自适应哈希索引、预读等高性能和高可用的功能。

 

 

存储引擎2:MyISAM

存储引擎3:MEMORY

存储引擎4:NDB

存储引擎5:Archive

存储引擎6:Federated

存储引擎7:Maria

其他存储存储引擎