一.MySQL中有哪些存储引擎?
- InnoDB存储引擎
InnoDB是MySQL的默认事务型引擎,也是最重要、使用最广泛的存储引擎。它被设计用来处理大量的短期(short-lived)事务,应该优先考虑InnoDB引擎。 - MylSAM存储引擎
在MySQL 5.1及之前的版本,MyISAM是默认的存储引擎。MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,但MyISAM不支持事务和行级锁,而且崩溃后无法安全恢复。MyISAM对整张表加锁,很容易因为表锁的问题导致典型的的性能问题。 - Mrg_MylSAM
Merge存储引擎,是一组MyIsam的组合,也就是说,他将MyIsam引擎的多个表聚合起来,但是他的内部没有数据,真正的数据依然是MyIsam引擎的表中,但是可以直接进行查询、删除更新等操作。 - Archive引擎
Archive存储引擎只支持INSERT和SELECT操作,会缓存所有的写并利用zlib对插入的行进行压缩,所以比MyISAM表的磁盘I/O更少。但是每次SELECT查询都需要执行全表扫描。所以Archive表适合日志和数据采集类应用,Archive引擎是一个针对高速插入和压缩做了优化的简单引擎。 - Blackhole引擎
Blackhole引擎没有实现任何的存储机制,它会丢弃所有插入的数据,不做任何保存。可以在一些特殊的复制架构和日志审核时发挥作用。但这种引擎在应用方式上有很多问题,因此并不推荐。 - CSV引擎
CSV引擎可以将普通的CSV文件(逗号分割值的文件)作为MySQL 的表来处理,但这种表不支持索引。因此CSV引擎可以作为一种数据交换的机制,非常有用。 - Federated引擎
Federated引擎是访问其他MySQL服务器的一个代理,它会创建一个到远程MySQL服务器的客户端连接,并将查询传输到远程服务器执行,然后提取或者发送需要的数据。默认是禁用的。 - Memory 引擎
Memory表至少比MyISAM 表要快一个数量级,数据文件是存储在内存中。Memory表的结构在重启以后还会保留,但数据会丢失。Memory表支持 Hash索引,因此查找操作非常快。Memroy表是表级锁,因此并发写入的性能较低,每行的长度是固定的,可能导致部分内存的浪费。 - NDB集群引擎
使用MySQL服务器、NDB集群存储引擎,以及分布式的、share-nothing 的、容灾的、高可用的NDB数据库的组合,被称为MySQL集群((MySQL Cluster)。
二.请你说说MySQL中innodb和myisam的区别?
MySQL支持的存储引擎是很多的,没有绝对的好坏之分,只有每一种存储引擎使用在不同应用场景上合适与否、高效高低等等、而不能认为就innodb存储引擎就是最后的,这样其实是不对的。接下来我们就来学习一下面试过程中最常问的两款存储引擎的对比。看看你能回答全吗?
- 事务:InnoDB支持事务,MyISAM不支持
- 锁:InnoDB支持行级锁和表锁,MyISAM只支持表级锁
- 读写性能:InnoDB增删改性能更优,MyISAM查询性能更优
- 存储结构:InnoDB在磁盘存储为一个文件,MyISAM在磁盘上存储成三个文件(表定义、数据、索引)
- 全文索引:InnoDB不支持(但可通过插件等方式支持),MyISAM默认支持
- 外键:InnoDB支持外键,MyISAM不支持
- 存储空间:InnoDB需要更多的内存和存储,MyISAM支持支持三种不同的存储格式:静态表(默认)、动态表、压缩表
- 移植:InnoDB在数据量小时可通过拷贝数据文件、备份 binlog、mysqldump工具移植,数据量大时比较麻烦,可单独对某个表通过拷贝表文件移植
- 崩溃恢复:InnoDB有崩溃恢复机制,MyISAM没有.
三.InnoDB引擎的三大特性是什么?
InnoDB的三大特性是:BufferPool、自适应Hash索引、双写缓冲区。
3.1 自适应Hash索引
- InnoDB存储引擎内部自己去监控索引表,如果监控到某个索引经常用,那么就认为是热数据,然后内部自己创建一个hash索引,称之为自适应哈希索引( Adaptive Hash Index,AHI)。
- 创建以后,如果下次又查询到这个索引,那么直接通过hash算法推导出记录的地址,直接一次就能查到数据。
- InnoDB存储引擎使用的哈希函数采用除法散列方式,其冲突机制采用链表方式。
3.2 Buffer Pool
- 为了提高访问速度,MySQL预先就分配/准备了许多这样的空间,为的就是与MySQL数据文件中的页做交换,来把数据文件中的页放到事先准备好的内存中。
- 数据的访问是按照页(默认为16KB)的方式从数据文件中读取到 buffer pool中。Buffer Pool按照最少使用算法(LRU),来管理内存中的页。
- Buffer Pool实例允许有多个,每个实例都有一个专门的mutex保护。Buffer Pool中缓存的数据页类型有: 索引页、数据页、undo页、插入缓冲(insert buffer)、自适应哈希索引、InnoDB存储的锁信息、数据字典信息(data dictionary)等等。
3.3 双写缓冲区
- 双写缓冲区是一个位于系统表空间的存储区域,在写入时,InnoDB先把从缓冲池中的得到的page写入系统表空间的双写缓冲区。之后,再把page写到.ibd数据文件中相应的位置。如果在page写入数据文件的过程中发生意外崩溃,InnoDB在稍后的恢复过程中在doublewrite buffer中找到完好的page副本用于恢复。
- doublewrite是顺序写,开销比较小。所以在正常的情况下, MySQL写数据page时,会写两遍到磁盘上,第一遍是写到doublewrite buffer,第二遍是从doublewrite buffer写到真正的数据文件中。
- 写俩遍的主要作用是为了避免partial page write(部分页写入)的问题。因为InnoDB的page size一般是16KB,校验和写入到磁盘是以page为单位进行的。而操作系统写文件是以4KB作为单位的,每写一个page,操作系统需要写4个块,中间发生了系统断电或系统崩溃,只有一部分页面是写入成功的。这时page数据出现不一样的情形,从而形成一个”断裂”的page,使数据产生混乱。
四.总结
大家简单的回想一下我们上面学习过程的文章内容,看看自己是否掌握了呢?
- MySQL中有哪些存储引擎?
- 请你说说MySQL中innodb和myisam的区别?
- InnoDB引擎的三大特性?
大概就是这些内容,MySQL真的很重要,一定要多花点时间来学习这块的知识,不断地积累。
好了,这篇文章我们就说这么说吧,我是硕风和炜,我们下篇文章再见哦。
版权声明:本文为Coder_ljw原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。