在前三篇文章中,我们分析了外部环境对MySQL性能的影响,但起到决定性作用的还是MySQL本身。今天我们就来看看MySQL的架构,看看数据库到底是个什么东西。它是如何组成的。MySQL是典型的C/S架构应用。MySQLServer提供数据库服务完成客户端的请求和操作,Client负责连接Server。很多初学者不太容易区分MySQLServer和Client,因为我们安装好MySQL之后,默认Server和Client都是可用的。我们在命令行连接并登录MySQL服务,其实是ClientServe提供的。MySQL与其他关系型数据库的不同之处在于它的灵活性以及能够通过插件提供不同类型的存储引擎。MySQL的请求处理过程会根据不同的存储引擎而变化,这是它的特点。一、MySQL存储引擎这里主要给大家介绍一下MySQL存储引擎的发展历史。至于各个存储引擎的特点,宋哥会在后面的文章中为大家详细介绍。从MySQL的设计之初,存储引擎就是可插拔的,允许公司或个人根据自己的需要定义自己的存储引擎(当然,普通的公司或个人其实没有这个实力)。MySQL开发的广泛使用的存储引擎是MyISAM。MyISAM支持表锁,不支持行锁,所以在处理高并发写操作时效率较低。另外,MyISAM不支持外键(虽然现在实际项目中外键已经用的比较少了)。MyISAM虽然看起来有点简陋,但是不影响MySQL的普及,所以不得不说说MySQL中另一个大名鼎鼎的存储引擎InnoDB。InnoDB存储引擎由位于芬兰赫尔辛基的一家名为InnobaseOy的公司开发,其历史甚至比MySQL还要早。有的朋友可能会决定奇怪,插件的历史比宿主还长?InnoDB刚开始开发的时候,是作为一个完整的数据库来开发的,所以功能是很齐全的。开发出来后,创始人想把数据库卖掉,但一直没找到买家。后来,MySQL2.0推出后,这个可插拔的存储引擎引起了InnobaseOy创始人HeikkiTuuri的注意。与MySQL沟通后,决定将InnoDB作为存储引擎引入MySQL(这也是InnoDB比MySQL受欢迎的原因)。MySQL历史悠久),虽然MySQL支持InnoDB,但实际上还是主要推广自己的MyISAM。但是InnoDB就是这么牛逼,终于在2006年成功吸引了Oracle这个大魔王的注意,一挥手收购了InnoDB。MySQL主要推自家的MyISAM,日子很惨淡。最终在2008年被Sun以10亿美元拿下,这次操作巩固了Sun在开源领域的领导地位,但Sun的流动性一直比较弱,最终sun本身在2009年被甲骨文收购,甲骨文收购sun之后,InnoDB和MySQL都成为了甲骨文的产品,整合变得非常容易。在后来的版本中,InnoDB逐渐成为了MySQL默认的存储引擎。在最新的MySQL8中,元数据表也使用了InnoDB作为存储引擎。InnoDB存储引擎主要有以下特点:支持事务支持4级事务隔离支持多版本读取支持行级锁读写阻塞与事务隔离级别相关支持缓存,不仅可以缓存索引,还可以缓存数据整表和主键Cluster存储,形成平衡树并不代表InnoDB就一定好。在实际开发中,还是需要根据具体场景选择使用InnoDB还是MyISAM。MyIASM(该引擎是MySQL数据库5.5之前的默认存储引擎)特点:MyISAM不提供对数据库事务的支持,不支持行级锁和外键。由于2,执行INSERT或UPDATE更新语句时,写操作需要锁住整张表,所以会降低效率。MyISAM保存表中的行数。执行SELECTCOUNT(*)FROMTABLE时,可以直接读取相关值,无需全表扫描,速度快。两者的区别:MyISAM是非事务安全的,而InnoDB是事务安全的。MyISAM锁的粒度是表级的,而InnoDB支持行级锁。MyISAM支持全文索引,而InnoDB在MySQL5.6之前不支持全文索引。MySQL5.6开始支持全文索引(https://dev.mysql.com/doc/refman/5.6/en/mysql-nutshell.html)。使用场景对比:如果要进行大量的select操作,应该选择MyISAM如果要进行大量的insert和update操作,应该选择InnoDB。大型数据集倾向于选择InnoDB引擎,因为它支持事务处理和故障恢复。数据库的大小决定了故障恢复的时间长短。InnoDB可以使用事务日志进行数据恢复,速度会更快。主键查询在InnoDB引擎下也会相当快,但是需要注意的是,如果主键过长,也会造成性能问题。相对来说,InnoDB在互联网公司用得更多。这就是我们对MySQL存储引擎的简单介绍。松哥后面会写一篇文章,详细介绍各个存储引擎的特点。欢迎大家一起讨论。2.MySQL架构接下来我们来看一下MySQL的软件架构(图片来自网络)。从上图我们可以大致看出,MySQL的架构大致可以分为三层:客户端(应用层)服务层,存储引擎层。我们分开来看。2.1客户端基本上所有的C/S架构程序都有一个客户端层,主要包括以下三个方面:连接处理:当客户端向服务器发送连接请求时,MySQLServer会在线程池中分配一个线程进行连接与客户端,客户端以后所有的请求都会分配给这个线程。为了提高性能,MySQLServer提供了线程池,减少了创建和释放线程的时间。所有主流编程语言都可以使用自己的API与MySQL建立连接。用户认证:当客户端向MySQL服务器发起连接请求时,MySQL服务器会对发起连接的用户进行认证。MySQL身份验证基于:用户名、客户端主机地址和用户密码。用户认证:当客户端连接到MySQLServer时,MySQLServer会根据用户的权限决定用户可以执行哪些操作。2.2ServiceLayerMySQL服务层主要有6个东西,下面我们一一分析。2.2.1系统管控工具数据库备份与恢复数据库安全管理,如用户和权限管理数据库复制管理数据库集群管理数据库分区、分库、分表管理数据库元数据管理2.2.2连接池已在前面提到过,连接池负责存储和管理客户端与数据库之间的连接,一个线程管理一个连接。2.2.3SQL接口SQL接口用于接受客户端发送的各种SQL命令,返回用户需要的查询结果。如:DDLDML存储过程视图触发器等都在这里处理。2.2.4解析器解析器的作用是对查询语句进行解析,将客户端请求的SQL生成“解析树”,然后根据MySQL的语法规则检查解析树是否合法。如果语句的语法错误,它会返回相应的错误信息。语法检查通过后,解析器会查询缓存。如果缓存中有对应的语句,则直接返回结果,不进行下一次优化执行操作。2.2.5查询优化器,从名字就可以知道。这一步主要是在解析器完成解析并检查SQL语法后,对查询语句进行优化。主要的优化方法包括选择合适的索引和数据读取方式。2.2.6缓存包括全局缓存和引擎特定缓存,以提高查询效率。如果查询缓存中有命中的查询结果,则查询语句可以从缓存中取数据,无需进一步解析和执行。这种缓存机制由表缓存、记录缓存、键缓存、权限缓存等一系列小缓存组成。2.3存储引擎层存储引擎负责MySQL中数据的存储和提取,并与底层系统文件。MySQL存储引擎是可插拔的,服务器中的查询执行引擎通过接口与存储引擎进行通信,屏蔽了不同存储引擎之间的差异。现在的存储引擎有很多种,各有特点,最常见的有MyISAM和InnoDB。需要注意的是,MySQL存储引擎是针对数据表而不是数据库的。也就是说,在同一个数据库中,我们可以同时使用多个不同的存储引擎(技术上可行,但实际上并不推荐)。3.总结MySQL的分层设计使我们免受许多底层事物的影响。例如,存储引擎的具体工作机制往往对开发工程师是透明的。我们不用关心InnoDB是怎么工作的,自己写SQL就可以了(各个存储引擎支持的SQL也不一样,这是另外一个问题),对开发工程师更友好。好了,今天就和小伙伴们聊这么多吧~参考资料:https://zhuanlan.zhihu.com/p/43736857https://juejin.cn/post/6857688351168954376本文转载自微信公众号《江南A》小雨》,可通过以下二维码关注。转载本文请联系江南一点语公众号。
