今日复习:
-
MySQL的底层架构?
-
客户端和Mysql是如何建立连接的?
-
客户端获取到的数据库连接的本质是什么?
-
mysql解析器和优化器的作用?
-
mysql是如何执行一条sql语句的?
-
查询缓存是否存在,为什么mysql8.0把它移除了?
-
查询缓存和缓冲有什么区别?
-
sql执行之前会做什么?
-
数据库连接池和mysql自身的连接池有什么区别?
-
在高并发的情况下是不是把客户端的最大连接数调的越大越好?
-
mysql一条线程执行完成后,它是如何知道自己该向谁返回数据的?
-
什么是数据库的三范式?
-
什么是反范式设计?
- mysql的整体架构从上往下依次可以分为连接层,服务层,引擎层和文件层
- 连接层主要是指数据库的连接池,负责处理所有客户端的接入工作。如用户登录,授权和连接等
- 服务层:所有跨引擎的工作都会在这里完成。如sql解析,结果合并,执行计划生成等
- 引擎层:用于读写数据,决定了数据存储和读写的方式
- 文件层:对上层服务提供最基础的文件服务,如日志,数据,索引。
- 会先经过TCP/IP的握手过程,如果采用了加密,还会经过SSL的握手过程,握手完成后客户端会和MYSQL建立session连接。接着mysql会查询自身的mysql.user表,来验证客户端的用户名和密码,如果有误就报错,如果正确,会根据登录的用户名进行权限的授权,完成后就表示连接建立成功,后续的交互会采用半双工通信的方式。
- 数据库连接的本质就是一条条线程,当客户端和mysql建立连接成功后,mysql会建立一条线程去绑定当前的会话信息,当有sql到来时,该线程将会去执行,执行过程中也会由该线程去返回结果集,mysql会将此连接维护8个小时,当客户端主动退出连接后,mysql只会将该线程所绑定的会话信息清空,然后将空闲线程放入自身的连接池中。
- 解析器主要是用来词义,语义分析和语法树的生成,检测sql是否正确。优化器主要会对解析器生成的语法树,选出一套sql执行的最佳方案。
- 读语句:先将sql发送给sql接口,sql接口会对sql进行哈希处理。sql接口会在查询缓存中根据哈希值检索数据,如果缓存中有就返回数据。如果缓存未命中就会将sql交给解析器,解析器判断当前sql是否正确,如果错误就返回语法错误,如果正确就将sql语句交给优化器。优化器根据sql制定出不同的执行计划,并择选出最优的计划。工作线程根据执行计划,调用存储引擎所提供的api获取数据。存储引擎根据api调用方的操作,到磁盘中检索数据。发送磁盘io后,对于磁盘中符合要求的数据逐条返回给sql接口。sql接口会对所有的结果集进行处理,并返回。 写语句:先将sql发送给sql接口,sql接口会对sql进行哈希处理。sql接口会根据哈希值在查询缓存中查找,如果有,就将查询缓存中对应表的所有缓存全部删除。然后将sql交给解析器,判断sql语法是否正确,如果正确就交给优化器,优化器根据sql生成多套执行方案,并选择出最优的执行计划。在执行开始前,会先记录undo-log和redo-log日志,然后在缓冲区中查找是否存在当前要操作的行记录和表数据。如果存在,直接对缓冲区的数据进行写操作,然后等待后台线程将缓冲区数据刷到磁盘上,如果不存在,就根据执行计划,调用存储引擎的api,发生磁盘io,读取磁盘中的数据进行写操作。写操作完成后记录一下bin-log日志,同时将redo-log日志中的记录改为commit状态,将sql执行耗时和操作成功的结果返回给sql接口,再由sql接口返回给客户端。
- 查询缓存在8.0版本的时候就移除了,缓存命中率低,占用内存高,增加查询步骤,缓存维护的成本不小,查询缓存是给MyISAM准备的,Innodb引擎的缓冲区完全具备查询缓存的功能,现在的项目一般使用Redis作为缓存。
- 查询缓存只能给读语句使用,而缓冲读写都能使用
- 生成sql之后会去配置数据库连接池。从连接池中获取一个数据库连接然后发送给mysql进行执行,但执行之前还要判断当前连接的用户是否具备sql要操作表的权限
- 客户端连接池:减少多次创建数据库连接时,频繁出现的TCP/IP的等的握手过程,服务端连接池:减少多次创建数据库连接时,频繁创建和销毁工作线程的开销。
- 理论上是的,因为连接数越大,同一时间内可以执行更多的sql语句,也就是可以处理更多的用户请求。但是由于服务器硬件的配置,这种做法是不行的,比如一台服务器有8个cpu核心那说明同一时间内只能处理8个线程。如果线程数过多,就会频繁的进行上下文切换,这就有可能导致线程等待cpu的时间反而超出执行sql的时间。目前最好的配置是cpu核心数*2。
- 数据库连接时工作线程自身会绑定会话信息,这个会话信息中就包含了客户端的ip和端口等信息。当线程执行完成后,就可以根据会话信息来确定该向谁返回数据。
- 第一范式:要求一张表的各个字段,设计时必须保持原子性,即单个列只表示一个值不能再分。第二范式:要求一张表的所有字段,都必须依赖于主键,也就是一张表只能存同一个业务属性的字段。第三范式:要求表的每一列数据不能与主键之外的字段有直接的关系,也就是一张表只能有一个主属性存在。
- 不遵循范式设计的手段称为反范式设计。
- mysql的整体架构从上往下依次可以分为连接层,服务层,引擎层和文件层