昨个和一家面试官进行面试工作,面试官样子应该是项目经理级别,问到我一个问题:谈下MySql存储引擎的理解,例如:InnoDB?说实话,我蒙了,一直都是问Java相关的底层数据结构什么的,突然来个这个,学识浅薄。结束后赶紧补课:
首先就先说下什么是存储引擎:
存储引擎就是存储数据,建立索引,更新查询数据等技术的实现方式。
存储引擎是基于表的,而不是基于库的。所以存储引擎也可以被称作为“表类型”
对于其他数据库的存储引擎:Oracle,sqlServer等数据库只有一种存储引擎。MySQL提供了插件式的存储引擎架构。所以MySQL是存在多种存储引擎的,可以根据需要使用相应引擎,或者编写存储引擎。
如何知道有哪些存储引擎呢?是可以通过命令符来查询的:
使用MySQL的可视化工具或者使用命令行界面来操作:输入命令:show engines;
博主的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还提供了插入缓冲、二次写、自适应哈希索引、预读等高性能和高可用的功能。