前言
首先
Mysql
是一个可移植的数据库,几乎在当前所有系统上都能运行,比如Mac/Linux/Windowns
。尽管各个平台在底层实现方面各有不同,但是Mysql基本上能保证各个平台上的物理体系结构的一致性
1. Mysql的体系结构
1.1 Mysql的数据库与数据库实例
数据库(也就是常说的database
)和数据库实例(instance
这个说的比较少,但是用的多)之间的区别如下:
数据库:物理操作系统文件或者其它形式文件的集合,Mysql中的数据库文件有好几种,比如
frm、MYD、MYI
等等结尾的,当然也可能根据存储引擎的不同文件存放位置有可能在内存中。实例:Mysql数据库由后台线程及一个共享内存区组成。共享内存可以被运行的后台线程共享,数据库实例才是真正用于操作数据库文件的。
二者的名字可能在平时经常弄错,但是它们的职责却是完全不同的,在Mysql数据库中,实例与数据库的关系一般是一一对应的,也就是一个实例对应一个数据库,但是在集群情况下,一个数据库可能被多个数据库实例使用。Msyql是一个单进程多线程架构的数据库,Mysql数据库实例从系统的角度来看就是一个进程
。从概念上来说,数据库是文件的集合,是依照某种数据模型组织起来并存放于二级存储器的数据集合。数据库实例是程序,是位于用户与操作系统之间的一层数据管理软件,用户对数据库的任何操作包括数据库定义、查询、维护都是在数据库实例下进行的。应用程序只有通过数据库实例才能和数据库打交道。
1.2 Mysql的启动过程
当启动实例时,Mysql会去读取配置文件,根据配置文件的参数来启动数据库实例。在mysql数据库中,启动实例的时候按照/etc/my.cinf --> /etc/mysql/my.cnf-->/usr/local/mysql/etc/my.cnf --> ~/.my.cnf
这个顺序来加载配置文件的,并且后来者的配置会覆盖掉前面的配置,之所以这么搞是因为在不同的平台下这个配置文件的默认位置是不一样的。关于配置文件的内容,暂时只关注datadir
这个参数,从名字就能看出来,这个参数制定了数据库所在的路径,这个路径可以修改的,在Linux
下默认是/usr/local/mysql/data
,要注意的是这个路经只是一个链接,指向了/opt/mysql_data
这个目录,所以用户必须保证有这个目录的读写权限才能访问。
1.3 Mysql体系结构
话不多说,先上个官方给的图:
中文版架构图.jpg
Mysql数据库的体系结构.png
从图里可以知道,Mysql由以下几个部分组成的:
Connectors
连接池组件,不同语言与SQL进行交互的组件,比如Java使用JDBC与SQL进行交互Management Serveices & Utilities
:系统管理和控制工具,用来管理服务和工具组件SQL Interface
:这东西见名知意了,SQL接口组件,接收用户的SQL命令,并且返回用户需要查询的结果,比如select * from
就是调用SQL Interface
接口的Parser
解析器,SQL命令传递到解析器的时候会被解析器解析和验证。解析器是由Lex 和 YACC
实现的,是一个很长的脚本。主要功能是将SQL
语句分解成数据结构,并将这个结构传递到后续步骤,以后SQL
语句的传递和处理就是基于这个结构的,如果再分解过程中遇到错误那么久说明这个SQL
语句是不合理的。Optimizer
查询优化器:SQL语句在查询之前会使用查询优化器对查询进行优化,这个过程使用"选取->投影->联接"策略进行查询。比如select name from user where id = 1
这个select查询先根据where语句进行选取,而不是先把表全部查询出来以后再过滤.这个select会先根据name属性进行投影而不是将属性全部查出来过滤,将这2个查询条件联接起来最终生成查询结果。Cache & Buffer
:查询缓存 :,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据,这个缓存机制由很多缓存组成的,比如表缓存、记录缓存、key缓存、权限缓存等等Engine
:存储引擎,它是Mysql中具体与文件打交道的子系统也是Mysql最具特色的一部分,存储引擎是插件式的,它根据Mysql公司提供的文件访问层的一个抽象接口来定制一种文件访问机制(这种访问机制其实就叫存储引擎),现在有很多存储引擎,各具有各自的特性,比如InnoDB MyISAM
等等。需要注意的是,存储引擎是基于表的而不是基于数据库的,我们创建表的时候有时候会显示指定这个表所使用的存储引擎。File system和Files Logs
:这部分是数据库的层面,有许多格式的文件存储在硬盘上,又分为数据库文件和数据库的日志文件
1.4 Mysql的存储引擎
Mysql
的插件式的存储引擎结构可以说是Mysql很大的一个特性,好处是每个存储存储引擎都有各自的特点,能够根据具体的应用建立不同存储引擎表。又因为Mysql是开源的,所以有能力需求的公司可以根据自己的需要进行编写自己定义的引擎,比如大名鼎鼎的InnoDB
最开始就是第三方公司写的,后来被官方收购了。简单说下2种常见的存储引擎:
InnoDB
存储引擎将数据放在一个逻辑的表空间中,这个表空间就像一个黑盒一样由InnoDB
存储引擎自身进行管理。它通过多版本并发控制MVCC
来获得高并发性,并且实现了SQL标准的四种隔离级别,除此之外还提供了插入缓冲、二次写、自适应哈希索引、预读等高性能和高可用的功能。对于表中数据的存储,InnoDB采用了聚集的方式,因此每张表的存储都是按照主键的顺序进行存放的。如果没有显示定义指定主键,InnoDB存储引擎会为每一行生成一个6字节的ROWID
,以此为主键,具备高可用、高性能、高扩展性。MyISAM
:它的名气和InnoDB
一样大,在5.6之前它作为官方默认的存储引擎使用的。MyISAM存储引擎表由MYD/MYI
组成的,MYD用来存放数据文件,MYI用来存放索引文件,对于MyISAM存储引擎表,mysql数据库只缓存其索引文件,数据文件的缓存交由操作系统本身来完成,这与其它使用LRU算法缓存数据的大怒分数据库不相同的。
每种存储引擎的实现都不相同的,可以通过SHOW ENGINES
查看当前的mysql版本所支持的存储引擎。
1.5 Mysql的连接
1.5.1 TCP/IP方式
连接Mysql操作是一个连接进程和Mysql数据库实例进行通信,从程序设计的角度来说,本质上是进程通信。TCP/IP套接字方式是Mysql在任何平台下都提供的连接方式,也是网络中使用的最多的一种方式。这种方式在TCP/IP连接上建立一个基于网络的连接请求,一般情况下客户端在一台服务器上,而Mysql实例(server)在另一台服务器上,他们通过TCP/IP网络连接。在通过TCP/IP连接到MYSQL实例时,Mysql数据库会先检查一张权限视图,用来判断发起请求的客户端IP是否允许连接到Mysql实例,该视图在Mysql架构下,表名为user。这个表控制了某主机连接mysql的权限。
1.5.2 UNIX套接字
在Linux和UNIX环境下,还可以使用UNIX套接字连接,而UNIX套接字不是网络协议,所以就要求数据库实例和客户端在同一台服务器上,也就是本机安装的时候在配置文件中指定套接字文件的路径,--socket=/tmp/mysql.sock
。在知道了它的路径之后,就可以使用套接字进行连接,mysql -udavid -S /tmp/mysql.sock
小结
数据库实例和数据库是不一样的,数据库通常指的是各种存储的二进制文件的集合,数据库实例是一个进程专门用来和数据库进行操作的进程
数据库的引擎是插件式的,现在有很多引擎,他们各有各的特性并且用户可以根据自己的需求利用Mysql的接口自己扩展功能的引擎。
Mysql服务器的结构并没有想象中的太复杂,自上而下各个组件各有各自的功能,都是为了让MYSQL更好的执行的。
存储引擎是和表关联的,不是和数据库关联的,在创建表的时候可以执行存储引擎,如果没指定5.5以上默认
InnoDB
作者:忐忑忑忑忐忑
链接:https://www.jianshu.com/p/927c7216d026
共同学习,写下你的评论
评论加载中...
作者其他优质文章