标签:子查询 进程 数据 img 基于 logs 定制 管理 优化器
参考【mysql技术内幕】
一、mysql体系结构和存储引擎
1、数据库与数据库实例
数据库:物理操作系统文件或者其他文件组成的集合;
数据库实例:有数据库后台进程/线程和一个共享内存区域组成。
数据库就是文件,数据库实例是一个应用程序。用户对数据库的增删改查都是通过数据库实例进行的,其相当于是一个数据库管理软件。
2、mysql体系结构
MySQL结构包括:连接池组件、管理服务工具组件、SQL接口组件、查询分析器组件、优化器组件、缓存组件、插入式表存储引擎、物理文件‘。尤其注意插入式表存储结构,这是mysql特殊于其他数据库的地方,他是基于表的,不是数据库的。
抽象一点:
从图中我们可以看出,服务器程序处理来自客户端的查询请求大致需要经过三个部分,分别是连接管理
、解析与优化
、存储引擎
。
1、连接管理
客户端程序可以采用“link”介绍的TCP/IP
、命名管道和共享内存
、Unix域套接字
这几种方式之一来与服务器程序建立连接,服务器程序会缓存一些线程,每当有客户端连接进来的时候,会为这个客户端程序分配一个线程来处理它发过来的请求。
创建和销毁线程会耗费很多性能,所以在服务器端维护许多线程可以减少这部分的性能损耗。但是服务器端维护的线程数目是有限的,如果在短时间内有超级多的客户端连接进来的话,会有一部分因为获取不到线程而进入等待状态,直到有的客户端断开连接后这些等待的客户端才可以被分配到线程。
在客户端程序发起连接的时候,需要携带主机信息、用户名、密码,服务器程序会对客户端程序提供的这些信息进行认证,如果认证失败,服务器程序会拒绝连接。另外,如果客户端程序和服务器程序不运行在一台计算机上,我们还可以采用使用了SSL
(安全套接字)的网络连接进行通信,来保证数据传输的安全性。
2、优化与执行
当客户端程序成功的与服务器程序建立连接之后,就可以把文本命令发送到服务器程序了。这个部分大致需要需要查询缓存
、语法解析
、查询优化
这几个步骤来完成,我们详细来看。
查询缓存:如果我问你9+8×16-3×2×17
的值是多少,你可能会用计算器去算一下,或者牛逼一点用心算,最终得到了结果35
,如果我再问你一遍9+8×16-3×2×17
的值是多少,你还用再傻呵呵的算一遍么?我们刚刚已经算过了,直接说答案就好了。MySQL
服务器程序处理查询请求的过程也是这样,会把刚刚处理过的查询请求和结果缓存
起来,如果下一次有一模一样的请求过来,直接从缓存中查找结果就好了,就不用再傻呵呵的去底层的表中查找了。
当然,MySQL
服务器并没有人聪明,如果两个查询请求在任何字符上的不同(例如:空格、注释),都会导致缓存不会命中。另外,如果查询请求中包含系统函数、存储函数、自定义变量、mysql库中的系统表,那这个请求就不会被缓存,以函数举例,可能同样的函数的两次调用会产生不一样的结果,比如函数NOW
,每次调用都会产生最新的当前时间,如果在一个查询请求中调用了这个函数,那即使查询请求的文本信息都一样,那不同时间的两次查询也应该得到不同的结果,如果在第一次查询时就缓存了,那第二次查询的时候直接使用第一次查询的结果就是错误的!
不过既然是缓存,那就有它缓存失效的时候。MySQL的缓存系统会监测涉及到的每张表,只要该表的结构或者数据被修改,那与该表有关的缓存都会失效!
语法解析:如果缓存没有命中,接下来就需要进入正式的查询阶段了。首先客户端程序发送过来的请求只是一段文本而已,MySQL
服务器程序首先要对这段文本做分析,判断请求的语法是否正确,然后从文本中要查询的表、各种查询条件都提取出来。
查询优化:根据语法解析,服务器程序获得到了需要的信息,比如查询列表是什么,表是哪个,搜索条件是什么等等,但光有这些是不够的,因为我们写的MySQL
语句可能执行起来效率并不是很高,MySQL
的优化程序会对我们的语句做一些优化,如外连接转换为内连接、表达式简化、子查询的转为连接、使用索引吧啦吧啦的一堆东西,这部分我们后边会详细唠叨,现在你只需要知道在MySQL
服务器程序处理请求的过程中有这么一个步骤就好了。
截止到服务器程序完成了查询优化为止,还没有真正的去访问真实的数据表,MySQL
把数据的存储和提取操作都封装到了一个叫存储引擎
的模块里,我们知道表
是由一行一行的记录组成的,但这只是一个逻辑上的概念,物理上如何表示记录,怎么从表中读取数据,怎么把数据写入具体的物理存储器上,这都是存储引擎
负责的事情。为了实现不同的功能,MySQL
提供了各式各样的存储引擎
,不同存储引擎
管理的表结构可能不同,采用的存取算法也可能不同。不过这些存储引擎都向上边的服务层提供统一的调用接口,也就是对于我们使用者来说,如果我们需要使用某个存储引擎提供的特定功能,只需要简单的切换表的存储引擎就可以了。
所以在服务器程序完成了查询优化后,只需调用底层存储引擎提供的调用接口,获取到数据后返回给客户端程序就好了。
二、InnoDB存储引擎
MYSQL的核心就是表存储引擎。引擎接口开源,可以自己定制功能。InnoDB就是一个非常出名 的第三方引擎。
InnoDB有多个内存块,组成一个大的内存池,负责如下工作:维护所有进程/线程需要访问的多个内部数据结构;缓存磁盘上的数据,方便快速的读取;重做日志缓冲....后台线程主要作用是负责刷新内存池中的数据,保证缓存池中的数据是最新的数据,并且将已经修改的数据刷新到磁盘文件。其中,何时刷新有算法策略,不一定是实时刷新的,因为有的时候访问量太大,实时刷新难度比较大。参考我的前一篇文章------缓存。
1、后台线程
2、内存
三、
标签:子查询 进程 数据 img 基于 logs 定制 管理 优化器
原文地址:https://www.cnblogs.com/huangfuyuan/p/9460385.html