MySQL存储---innodb

参考【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服务器程序处理请求的过程中有这么一个步骤就好了。

  3、存储引擎

  截止到服务器程序完成了查询优化为止,还没有真正的去访问真实的数据表,MySQL把数据的存储和提取操作都封装到了一个叫存储引擎的模块里,我们知道是由一行一行的记录组成的,但这只是一个逻辑上的概念,物理上如何表示记录,怎么从表中读取数据,怎么把数据写入具体的物理存储器上,这都是存储引擎负责的事情。为了实现不同的功能,MySQL提供了各式各样的存储引擎,不同存储引擎管理的表结构可能不同,采用的存取算法也可能不同。不过这些存储引擎都向上边的服务层提供统一的调用接口,也就是对于我们使用者来说,如果我们需要使用某个存储引擎提供的特定功能,只需要简单的切换表的存储引擎就可以了。

  所以在服务器程序完成了查询优化后,只需调用底层存储引擎提供的调用接口,获取到数据后返回给客户端程序就好了。

二、InnoDB存储引擎

  MYSQL的核心就是表存储引擎。引擎接口开源,可以自己定制功能。InnoDB就是一个非常出名 的第三方引擎。

  InnoDB有多个内存块,组成一个大的内存池,负责如下工作:维护所有进程/线程需要访问的多个内部数据结构;缓存磁盘上的数据,方便快速的读取;重做日志缓冲....后台线程主要作用是负责刷新内存池中的数据,保证缓存池中的数据是最新的数据,并且将已经修改的数据刷新到磁盘文件。其中,何时刷新有算法策略,不一定是实时刷新的,因为有的时候访问量太大,实时刷新难度比较大。参考我的前一篇文章------缓存。

1、后台线程

2、内存

三、

猜你喜欢

转载自www.cnblogs.com/huangfuyuan/p/9460385.html