计算机在完成了硬件和操作系统的构建后,最重要的一件事情就是要处理数据。在现代意义的数据库出现之前(20世纪60年代),人们通过人工和文件系统的方式来存储、管理数据。在人工管理时期,人们常使用穿孔纸带来管理数据 ,虽然穿孔纸带因不具备电子化特征、但这也算计算机计算过程中最早的数据库。
那么我们现在使用各种关系型数据库,是怎样在在操作系统中安装,做数据运算呢。这一节以MySQL为例,学习一下MySQL。
1、数据库的定义
数据库:( Database,DB)是按照一定的逻辑结构组织、存储、管理数据的大容量电子文件柜。
2、数据库管理系统
数据库管理系统(Database Management System,DBMS )是对数据库进行统一管理和控制的大型软件,主要由内核组件集和驱动组件构成,其中内核组件集按照功能模块划分为管理组件、存储组件、计算组件和网络组件。
3、数据库的发展史
从1964年,世界上第一个数据库系统IDS(Integrated Data Storage,集成数据存储)诞生开始,到今天数据库发展已经超过了60年。
1、mysql整体逻辑架构
根据前面章节的思路,软件中很多架构都可以分成3层。mysql数据库也是一样
从最下面开始,分别是存储引擎层,数据处理层和网络连接层
存储引擎层。通常叫做StorEngine Layer ,也就是底层数据存取操作实现部分,由多种存储引擎共同组成。它们负责存储和获取所有存储在MySQL中的数据。就像Linux众多的文件系统 一样。每个存储引擎都有自己的优点和缺陷。服务器是通过存储引擎API来与它们交互的。这个接口隐藏 了各个存储引擎不同的地方。对于查询层尽可能的透明。这个API包含了很多底层的操作。如开始一个事 物,或者取出有特定主键的行。存储引擎不能解析SQL,互相之间也不能通信。仅仅是简单的响应服务器 的请求。
数据处理层。这是MySQL的核心部分。通常叫做 SQL Layer。在 MySQL据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断, sql解析,行计划优化, query cache 的处理以及所有内置的函数(如日期,时间,数学运算,加密)等等。各个存储引擎提供的功能都集中在这一层,如存储过程,触发器,视 图等。
网络连接层。所包含的服务并不是MySQL所独有的技术。它们都是服务于C/S程序或者是这些程序所需要的 :连接处理,身份验证,安全性等等。
2、mysql各层模块构成
各模块解析
1.Connectors
指的是不同语言中与SQL的交互,如php、java等。
2 Management Serveices & Utilities:
系统管理和控制工具
3 Connection Pool: 连接池
管理缓冲用户连接,线程处理等需要缓存的需求。
负责监听对 MySQL Server 的各种请求,接收连接请求,转发所有连接请求到线程管理模块。每一个连接上 MySQL Server 的客户端请求都会被分配(或创建)一个连接线程为其单独服务。而连接线程的主要工作就是负责 MySQL Server 与客户端的通信, 接受客户端的命令请求,传递 Server 端的结果信息等。线程管理模块则负责管理维护这些连接线程。包括线程的创建,线程的 cache 等。
4 SQL Interface: SQL接口。
接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就是调用SQL Interface
5 Parser: 解析器。
SQL命令传递到解析器的时候会被解析器验证和解析。解析器是由Lex和YACC实现的,是一个很长的脚本。
在 MySQL中我们习惯将所有 Client 端发送给 Server 端的命令都称为 query ,在 MySQL Server 里面,连接线程接收到客户端的一个 Query 后,会直接将该 query 传递给专门负责将各种 Query 进行分类然后转发给各个对应的处理模块。 主要功能: a . 将SQL语句进行语义和语法的分析,分解成数据结构,然后按照不同的操作类型进行分类,然后做出针对性的转发到后续步骤,以后SQL语句的传递和处理就是基于这个结构的。 b. 如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的
6 Optimizer: 查询优化器。
SQL语句在查询之前会使用查询优化器对查询进行优化。就是优化客户端请求的 query(sql语句) ,根据客户端请求的 query 语句,和数据库中的一些统计信息,在一系列算法的基础上进行分析,得出一个最优的策略,告诉后面的程序如何取得这个 query 语句的结果
他使用的是“选取-投影-联接”策略进行查询。 用一个例子就可以理解: select uid,name from user where gender = 1; 这个select 查询先根据where 语句进行选取,而不是先将表全部查询出来以后再进行gender过滤 这个select查询先根据uid和name进行属性投影,而不是将属性全部取出以后再进行过滤 将这两个查询条件联接起来生成最终查询结果
7 Cache和Buffer: 查询缓存。
Cache:主要功能是将客户端提交 给MySQL 的 Select 类 query 请求的返回结果集 cache 到内存中,与该 query 的一个 hash 值 做一个对应。该 Query 所取数据的基表发生任何数据的变化之后, MySQL 会自动使该 query 的Cache 失效。在读写比例非常高的应用系统中, Query Cache 对性能的提高是非常显著的。当然它对内存的消耗也是非常大的。
如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,key缓存,权限缓存等。
8 、存储引擎接口
存储引擎接口模块可以说是 MySQL 数据库中最有特色的一点了。目前各种数据库产品中,基本上只有 MySQL 可以实现其底层数据存储引擎的插件式管理。这个模块实际上只是 一个抽象类,但正是因为它成功地将各种数据处理高度抽象化,才成就了今天 MySQL 可插拔存储引擎的特色。
3、一条select语句在mysql中是如何执行的,主要有6个步骤。
SQL执行步骤:请求、缓存、SQL解析、优化SQL查询、调用引擎执行,返回结果
1、连接:客户端向 MySQL 服务器发送一条查询请求,与connectors交互:连接池认证相关处理。
2、缓存:服务器首先检查查询缓存,如果命中缓存,则立刻返回存储在缓存中的结果,否则进入下一阶段
3、解析:服务器进行SQL解析(词法语法)、预处理。
4、优化:再由优化器生成对应的执行计划。
5、执行:MySQL 根据执行计划,调用存储引擎的 API来执行查询。
6、结果:将结果返回给客户端,同时缓存查询结果。