一、为什么要使用数据库?
使用一个东西,就要清楚它的功能价值,才能更好的利用它,使我们在工作生活中游刃有余。关于数据库的使用,好多人会说,一个数据库就是好多张表,那么为什么不使用如Excel的表格呢,作为Mysql的使用者,我们就必须清楚数据库区别于表格的地方,至少要对它有一点了解。
1、首先,数据库的数据量是没有上限的,但是Excel表格却有。下面一组数据可以说明这个问题:
- 在2003年之前,一个Excel表格最大行数为65536行
- 在2007年之后,一个Excel表格的最大行数为1048576行
随着互联网越来越深入到人们生活的方方面面,市场的需求日益扩大,在大部分中大型公司甚至小公司的运营中,他们的业务数据量是千万甚至亿级的,如此庞大的数据信息,用Excel是不合适的,也是不现实的;虽然数据库单库行数过多时,存在性能上的问题,但是我们可以用过分库,分表,分布式,合理的索引等技术手段,来实现数据库的三高(高并发、高性能、高可用)。
2、数据库具有完备的结构化查询语言,即sql语言,虽然Excel也有查询语言,但是性能却远远无法与sql相比。
3、数据库的服务化:数据库是面向软件的,这要区别于Excel,Excel是文件级别的,面向的始终是终端用户,而数据库只提供软件接口。
4、支持事务:我们来看看事务的定义:事务是指是程序中一系列严密的逻辑操作,而且所有操作必须全部成功完成,否则在每个操作中所作的所有更改都会被撤消。可以通俗理解为:就是把多件事情当做一件事情来处理,好比大家同在一条船上,要活一起活,要完一起完 。事务是十分重要的,就好比如转账过程:小明和小王账户余额各为1000元,此时小明向小王转账500元,小王的账户应当加500,而小明的账户应当减500,这样子才算完成了转账,事务通过了,大家相安无事,如果中间出了什么问题,小明账户扣了500,但是小王的却没有加,那么就回滚到出现问题之前,两人账户都为1000元,这就是事务的作用,试想没有事务,那么会多出来多少纠纷呢?
5、支持分布式,分布式是数据库的巨大潜力所在,数据库可以通过主备复制、高可用、分布式等形态,极大地提高性能。
二、软件的典型架构
分析数据库的典型架构之前,我们先了解一下常见的软件设计架构:
- 分层架构:这是最广泛也是最常见的架构,通过层(Layer)来隔离不同的关注点(Concern Point),以此应对不同需求的变化,使得这种变化可以独立进行;此外,分层架构模式还是隔离业务复杂度与技术复杂度的利器,常见的三层架构:表现层--->业务层---->数据持久层(与数据库交互),平时我们开发Web应用就会经常用到分层的设计。
- 事件驱动架构:事件驱动架构模式是一种主流的异步分发事件架构模式,常用于设计高度可拓展的应用。事件驱动架构模式由高度解耦、单一目的的事件处理组件构成,这些组件负责异步接收和处理事件。如下图:
通俗的讲:一个事件(Event)进入到事件通道(消息中间件)中,然后消息中间件再根据该事件的属性等特征,将其路由到事件进程中进行处理,然后响应结果给消息中间件,然后根据需要进行二次处理。
- 管道——过滤器架构:相当于一个事件、数据输入进入一个管道进行filter,多次的过滤处理,达到我们想要的结果,进行输出。如下图:
- 微核架构:主要依靠插件来实现功能,自己的内核是比较小型的,如IDEA,VScode。如图:
三、Mysql软件架构
如图:
*其中InnoDB、MyISAM、Archive为存储引擎。
1、 分析架构:
- 对于上图的MySQL架构,我们可以看成五层,分别为客户端——>连接器——>server层(缓存、分析器、优化器及执行器)——>存储引擎——>文件系统,这是典型的分层架构;
- 横看成岭侧成峰,远近高低各不同,我们可以从sql的执行着手分析,这便是一个管道过滤器架构,客户端到连接器再到后面的分析器、优化器、执行器,最后通过存储引擎再到客户端,层层分析优化到执行落盘。
- 如果我们把连接器到执行器这一部分看做是MySQL的内核,将三种存储引擎当做插件,那么这便是一个微内核架构,存储引擎越多,功能越加强大,即使MySQL没有这些存储引擎,他也是能工作的,有了他们是锦上添花,更加强大丰富。
2、对此总结:大型的软件并不是单一的架构,如MySQL可以看到分层、管道过滤器(责任链)、微内核等架构的集合。
四、MySQL四种常见的存储引擎
1、InnoDB:作为MySQL5.5.5版本之后默认的存储引擎,红的发紫,支持事务、外键、崩溃修复、并发控制等,也为MySQL在市场上的地位的保持提供了强有力的支持。
2、MyISAM:MySQL5.5.5版本之前默认的存储引擎,插入、查询数据的速度快,性能好,也为它在数据的存储上采用了B+树结构,且不支持事务(功能越少,事情越少,当然也就比较快),而且该引擎的空间利用率较高。
3、Memory:单词memory内存的意思,顾名思义,该引擎所有的数据都存在内存中,速度很快(不论是查询还是插入),但是数据安全性低,因为都在内存中,一旦设备断电损坏等,容易造成数据的丢失,从而造成不可估量的损失,所以在使用存储引擎时要评估风险,因业务性质制宜。
4、Archive:数据压缩放进磁盘,空间利用率高,但不支持索引,这也导致了它插入数据快,取出数据慢,查询性能差。一般我们用它存放一些日志信息等不经常查询的数据。
五、客户端是如何连接MySQL数据库的
1、常见的连接方式有很多种,这里举例四种:
- TCP/IP连接:MySQL在任何平台都提供的连接方式。
- 命名管道:Windows系统特有的连接方式,需要在同一台服务器才能进行通讯,开启方式为:--enable-named-pipe。
- 共享内存:开启方式:
服务端:--shared-memory
客户端:--protocol=memory
客户端:-S=/tem/mysql.sock
服务端:--socket=/tem/mysql.sock
2、MySQL的TCP讯通协议基本过程:
*过程分析:
- 认证连接:服务端向客户端发送握手初始化包——>客户端向服务端发送验证——>服务端向客户端发送认证结果消息。这个过程为什么是服务端先发送数据包呢?就好比如我们去饭店吃饭,服务员会先开口欢迎并询问吃什么,几个人一样,再由我们顾客来回答。
- 命令执行:客户端向服务端发送命令包(Command Packet)——>服务端向客户端发送回应包。
- 断开连接:客户端向服务器发送退出命令包
3、MySQL TCP报文格式:
- 消息头(header):三字节报文长度,一字节为序列号。
- 消息体(body):一字节为指令其余为参数,即数据,例如切换数据库的指令为0X02、查询命令指令为0X03。
- 推荐抓包工具:wireshark网络分析器。
六、一条sql是如何执行的(步骤及其功能作用)?
- 连接器:监听客户端请求,然后将请求指令转发给缓存(查询缓存)
- 查询缓存:缓存是指之前执行过的语句以K-V键值对的形式存在内存中;数据表被删除后,会删除所有相关的缓存;所有在MySQL8.0之后,缓存功能由于性能的浪费被删除了。
- 分析器:先做词法分析,分析该语句关键字(如SELECT、DELETE、JOIN、UPDATE等),再做句法分析,判断sql是否符合语法。
- 优化器:主要工作为决定如何使用索引。
- 执行器:主要工作为校验权限,以行作为粒度调用存储引擎;校验权限是校验此用户对目标数据是否有访问操作的权限;在没有索引时,执行器会循环查询所有行(索引对于性能的提高很重要)
- 存储引擎(这里以InnoDB为例):将指令落实在数据文件上。
完毕!谢谢耐心观看。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)