MySQL的知识面试中还是经常被问到的,简单的使用似乎无法达到面试官的要求,很多问题会关于Mysql存储引擎,所以这里还是需要系统学习一下Mysql的一些知识,面试过程中游刃有余。
MySQL体系结构
MySQL是多个子系统构成的层次化的系统。
a.Connectors:用来与客户端应用程序建立连接的数据库接口。(提供各种高级语言的版本,比如之前的Mysql-python-connector)。
b.Management Services & Utilities:系统管理与服务控制相关的辅助工具。
c.Connection Pool:负责处理与用户访问有关的用户登录,线程处理,内存和进程缓存需求。
d.SQL Interface:提供从用户接收命令并把结果返回给用户的机制。
e.Parser:针对SQL语句进行语法分析和解析,构建一个用来查询的数据结构。
f.Optimizer:优化查询语句,是的数据检索动作的效率非常的接近最优化。使用一种“选取-投影-联结”的策略进行优化,首先根据限制条件,即where语句选取满足条件的数据,然后根据select后面的属性进行投影,最后根据联结条件得出最终的数据。
g.Caches & Buffers:保证使用最频繁的数据能够以最高效率的方式被访问,提供的缓存方式:表缓存,记录缓存,键缓存,权限缓存,主机名缓存。
h.Pluggable Storage Engines:插件式的存储引擎,底层物理结构的实现,负责数据库执行实际的I/O操作,基于表结构,不是基于数据库的,可以为不同的表定制不同的存储引擎。其核心是一个抽象的文件访问接口,所以存在第三方实现的存储引擎,利用这个文件访问接口建立的新的文件访问机制。
Mysql主要存储引擎
存储引擎的关键技术点(各个引擎的实现的着重点不同,重视不同的技术点):
1.并发性:锁粒度。 锁的粒度越大,加锁消耗越少,并发度也就越低。Mysql提供三种锁的粒度,表级>页级>行级。
2.事务支持:ACID。原子性,一致性,隔离性,持久性。 事务的特性。
3.引用完整性:外键支持。 引用完整性及维持外键引用的关系,学生(学号,姓名,性别,年龄,班级编号)其中学号为主码。班级(班级编号,学生数量,班主任姓名),其中班级编号为主码。用完整性就是定义外关键字与主关键字之间的引用规则。如果要删除被引用的对象,那么也要删除引用它的所有对象,或者把引用值设置为空(如果允许的话)。
4.物理存储:表与索引等文件格式。
5.索引支持:索引策略与方法。
6.内存高速缓存:缓存与缓冲策略。
7.其他目标特性:安全限制等。
InnoDB
支持事务(很重要的特性)
行锁设计,提供并发性,同时支持MVCC。(多版本并发控制)
支持外键,确保引用完整性
独立的ibd文件存储表结构和数据
适用于:强调可靠性和需要支持事务处理的场景。
MyISAM
不支持事务
表锁设计
全文索引
存储表由MYD和MYI组成,分别存放数据和索引
使用数据压缩和索引优化
特点:可靠性高,适用范围广,检索速度快
适用于:强调数据检索速度
NDB
Network database,一种集群存储引擎
采用share nothing集群架构-每个节点拥有自己的内存和磁盘
数据全部存储在内存中,主键查询速度快
增加NDB的存储节点,线性提高性能
join连接的网络消耗大
对RAM需求较大
适用于:冗余,高可用性,负载均衡(难道需要负载均衡器,应该设计好了)
Memory
表数据存放在内存中
默认使用哈希索引
.frm的扩展名指明它存储的表定义
服务器存储,表中数据丢失(RAM存储决定)
只支持表锁,并发性差
不支持TEXT和BLOB类型
按照定长方式存储变长VARCHAR类型
高速度,低延迟,不适合频繁读写(why?)
适用于:临时存储,数据仓库的维度表
NDB相比于Memory来说,NDB支持行锁机制,并发性更高,可以选择磁盘存储介质存储,而且Cluster的架构保证NDB99.999%的可用性,支持Memory中不支持的数据类型。
Archive
提供高速的插入和压缩功能
行锁,仅支持insert和select,不支持事务,数据压缩
适用于:存储归档数据,日志信息
Maria
取代原有的MyISAM存储引擎,缓存数据和索引文件,行锁设计,支持MVCC功能,支持事务和非事务安全