MySQL 架构组成—存储引擎

  1. 云栖社区>
  2. 博客>
  3. 正文

MySQL 架构组成—存储引擎

技术小大人 2017-11-15 13:58:00 浏览2595
展开阅读全文

博主QQ:819594300

博客地址:http://zpf666.blog.51cto.com/

有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持!

MySQL Server 系统架构

wKioL1jaEPiTozfNAAMX5gQ4V3w567.jpg

上图的大概简易图如下:

wKiom1jaEPniN6c5AAJp3-dGNZA234.jpg

逻辑模块组成:

MySQL逻辑结构可以看成是二层架构

第一层我们通常叫做SQL Layer(SQL层,这一层是mysql的逻辑组件),在MySQL 数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断,sql解析,执行计划优化,query cache 的处理等等;

第二层就是存储引擎层,我们通常叫做StorageEngine Layer,也就是底层数据存取操作实现部分,由多种存储引擎共同组成。

所以,可以用如下一张最简单的架构示意图来表示MySQL 的基本架构,如图所示

wKiom1jaEPmgGQTcAADXTrpApw8906.jpg

说明:从上图看起来MySQL逻辑架构非常的简单,但实际上每一层中都含有各自的很多小模块,尤其是第一层SQLLayer,结构相当复杂的。

 

下面介绍mysql存储引擎

一、   mysql存储引擎介绍:

Mysql5.1版本之前的版本,存储引擎是需要mysql安装时必须和mysql一起呗编译并同时被安装的。

Mysql5.1版本之后的版本,AB公司引入一个新的概念“插件式存储引擎体系结构”,AB公司在架构改造的时候,让存储引擎和sql层各自独立,耦合更小,可以做到在线加载新的存储引擎(即可以将一个新的存储引擎加载到一个正在运行的mysql中,而不影响mysql的正常运行)。

Mysql插件式存储引擎主要包括:

MyISAM,Innodb,NDB Cluster,Maria,Falcon,Memory,Archive等。

其中最著名而且使用最为广泛的MyISAM和Innodb两种存储引擎

 

MyISAM是MySQL 最早的ISAM 存储引擎的升级版本,也是MySQL 默认的存储引擎

Innodb实际上并不是MySQ公司的,而是第三方软件公司Innobase(在2005 年被Oracle 公司所收购)所开发,其最大的特点是提供了事务控制等特性,所以使用者也非常广泛。

其他的一些存储引擎相对来说使用场景要稍微少一些,都是应用于某些特定的场景:

NDBCluster虽然也支持事务,但是主要是用于分布式高可用集群环境

Maria是MySQL最新开发的对MyISAM的升级版存储引擎

Falcon是MySQL 公司自行研发的为了替代当前的Innodb存储引擎的一款带有事务等高级特性的数据库存储引擎。

Memory存储引擎所有数据和索引均存储于内存中,仅保存.frm文件在硬盘,所以主要是用于一些临时表,或者对性能要求极高,但是允许在Crash (崩溃、瘫痪)的时候丢失数据的特定场景下,会消耗内存较大

Archive是一个数据经过高比例压缩存放的存储引擎仅支持insert,select,不支持update和delete,主要用于存放过期而且很少访问的历史信息,不支持索引

 

MyISAM存储引擎简介:

是否为默认mysql5.1之前为默认存储引擎,之后就不是了。

文件组成:MyISAM存储引擎的表在数据库中,每一个表都被存放为三个以表名命名的物理文件。

         三个文件:①首先肯定会有任何存储引擎都不可缺少的存放表结构定义信息的.frm文件

                    .MYD文件,存放该表的存储数据

                    ③.MYI文件,存放该表的索引数据

          说明每个表都有且仅有这样三个文件做为MyISAM存储类型的表的存储,也就是说不管这个表有多少个索引,都是存放在同一个.MYI 文件中

支持以下三种类型的索引

           B-Tree 索引:所有的索引节点都按照balance tree (平衡树)的数据结构来存储,所有的索引数据节点都在叶节点。

          R-Tree 索引:存储方式和B-Tree 索引有一些区别,主要设计用于为存储空间和多维数据的字段做索引,所以目前的MySQL版本来说,也仅支持geometry(几何) 类型的字段作索引。

           Full-text 索引:就是全文索引,他的存储结构也是B-Tree。主要是为了解决在我们需要用like 查询的低效问题。

          说明:MyISAM引擎上面的三种索引类型中,最常使用的就是B-Tree索引,偶尔会用到Full-text索引,但是R-Tree索引一般在系统中很少用得到。另外MyISAM的B-Tree索引又一个较大的限制,那就是参与一个索引的所有字段的长度纸盒不能超过1000字节。

是否支持事务:不支持事务

支持什么锁:只支持表锁,不支持行锁

什么情况会造成表损坏:①mysql正在往表内写入数据,突然被kill掉

                      ②主机宕机(crash)

                      ③磁盘硬件损坏

数据存放格式分为三种:①静态(FIXED)固定长度

                      动态(DYNAMIC)可变长度

                      压缩(COMPRESSED)

                        说明:①当然三种格式中是否压缩是完全可以任由自己选择的,可以在创建表的时候通过row_format 来指定{COMPRESSED | DEFAULT},也可以通过myisampack工具来进行压缩,默认是不压缩的。

                         ②而在非压缩的情况下,是静态还是动态,就和我们表中的字段的定义相关了。只要表中有可变长度类型的字段存在,那么该表就肯定是DYNAMIC 格式的,如果没有任何可变长度的字段,则为FIXED 格式,当然,你也可以通过alter table 命令,强行将一个带有VARCHAR 类型字段的DYNAMIC 的表转换为FIXED,但是所带来的结果是原VARCHAR 字段类型会被自动转换成CHAR 类型。相反如果将FIXED 转换为DYNAMIC,也会将CHAR类型字段转换为VARCHAR 类型。

               举例说明一下说明②中的说明意思

                “name   char(30)”,则用户lisi就占30位(即字节);

                “name   varchar(30)”,则用户lisi就占4位(即字节)。

 

知识点扩展:如何根据表的记录数量估算占用的磁盘空间

大概思路:首先先算一个表中一行有多少个字节。

然后根据数据库中的表每天增加多少行记录,就能够算出每天要增加多少硬盘空间,这样就可根据数据量估算规划多大的空间。

举例来说明怎么操作

1在数据库bdqn中创建一个表tb

wKioL1jaEPuA5tyEAANuYaEeVJI124.jpg

2执行mysql>desc  bdqn.tb查看tb的表结构

wKiom1jaEPzSOpzSAAJbuQ9TE2U415.jpg

10个字节+20个字节+2个字节+20字节+8字节+8字节+100个字节=168字节

即tb表一行数据最大有168个字节

3)假设每天增加1万条记录

大约需要10000×168÷1024÷1024=1.6MB,这样就可以根据每天增加的记录数,合理规划好磁盘空间。

总结说明:MyISAM存储引擎的某个表文件出错之后,仅影响到该表,而不会影响到其他表,更不会影响到其他的数据库。如果我们的数据库正在运行过程中发现某个MyISAM表出现问题了,则可以在线通过check table 命令来尝试校验他,并可以通过repair table 命令来尝试修复。在数据库关闭状态下,我们也可以通过myisamchk工具来对数据库中某个(或某些)表进行检测或者修复。不过强烈建议不到万不得已不要轻易对表进行修复操作,修复之前尽量做好可能的备份工作,以免带来不必要的后果。

 


Innodb 存储引擎简介:

特点:

1、支持事务:一个事务内的语句要么全部成功执行,要么全部不成功,事务会回滚到原始状态。而myisam引擎不支持事务。

2、支持行锁:而myisam只支持表锁。

3、支持外键:而myisam不支持外键。外键的含义就是确保引用的完整性。比如A表引用B表的数据,就是引用外键。

4、它也有.frm文件,用来存放表结构定义相关的元数据,但和myisam不同的是innodb的表数据和索引数据是存放在一起的(即.ibd文件)。至于是独表空间还是共享表空间,就是由用户自己决定。

Innodb 的物理结构分为两大部分

1、数据文件(包含表数据和索引数据)

存放数据表中的数据和所有的索引数据,包括主键和其他普通索引。Innodb里面也有表空间概念,但是和oracle的表空间不同。Innnodb的表空间有两种形式,一种是共享表空间,所有的表数据和所有的索引数据都在一个表空间里面,可以通过innodb_data_file_path来指定,但是增加数据文件需要重启服务;另外一个就是独享表空间,表数据和索引数据一起存放在.ibd文件里面。

虽然用户可自定义是使用独享还是共享表空间,但是共享表空间必须存在,因为innodb的undo信息和其他一些元数据信息都是存放在共享表空间的,共享表空间的数据文件可以设置固定大小或者自动扩展大小两种形式。

当表空间不够了,只有共享表空间才可以增加数据文件,具体的就是在innodb_data_file_path参数后面按照标准格式设置好数据文件的路径和相关属性即可。但是有一点需要注意,innodb在创建新数据文件的时候不会自动创建目录的,如果指定的目录不存在,重启服务会报错并无法启动。

2、日志文件

Innodb的日志文件和oracle的redo日志(即重做日志文件,mysql里的innodb的redo日志叫事务日志)比较类似,同样可以设置多个日志组(至少2个),同样采用轮询策略来顺序的写入。

由于Innodb 是事务的存储引擎,所以系统Crash(宕机)对他来说并不能造成非常严重的损失,由于有redo日志(即事物日志)的存在,有checkpoint 机制的保护,Innodb 完全可以通过redo 日志将数据库Crash 时刻已经完成但还没有来得及将数据写入磁盘的事务恢复,也能够将所有部分完成并已经写入磁盘的未完成事务回滚并将数据还原。

Innodb 不仅在功能特性方面和MyISAM 存储引擎有较大区别,在配置上面也是单独处理的。在MySQL 启动参数文件(/etc/my.cnf)设置中,Innodb 的所有参数基本上都带有前缀“innodb_”,不论是innodb 数据和日志相关,还是其他一些性能,事务等等相关的参数都是一样。和所有Innodb 相关的系统变量一样,所有的Innodb 相关的系统状态值也同样全部以“Innodb_”前缀。

 

 

Myisam和innodb的区别:

1myisam不支持事务,innodb支持事务,innodb的autocommit是默认打开的,即每条sql语句会默认被封装成一个事务,自动提交,但是这样会影响速度,最好的办法是把很多条SQL语句放在begin和commit之间,组成一个事务再提交过去,这样的话很多条SQL语句就算是一个事务

wKioL1jaEPzSl1ynAAFGEgyWw0g750.jpg

wKioL1jaEP3T6CKYAAOTQIDJdI0792.jpg

2、innodb支持行锁,而myisam只支持表锁。Myisam上同一个表读锁和写锁是互相排斥的,等待队列中既有读锁又有写锁,则写锁优先级高,即使读锁先到,写锁后到,也是写锁优先执行。所以myisam不适合用于有大量查询和修改并存的环境中,就是因为myisam只支持表锁。

3innodb支持外键,而myisam不支持外键

4innodb不支持全文索引,但是myisam支持全文索引

5innodb的表数据和索引数据是在一个表空间内,myisam的表数据和索引数据是分开存放的。

 

 

Mysql自带工具使用介绍

Mysql数据库不仅提供了数据库的服务端应用程序,同时还提供了大量的客户端工具程序,

比如:mysql、mysqladmin、mysqldump

1、mysql命令

作用:为用户提供一个命令行接口来操作管理mysql服务器。

语法结构:mysql  [options]  [database]         //mysql[选项] [数据库]

Mysql主要选项

         “-e”  //单词execute(执行)的缩写

          作用:告诉MySQL,我要执行“-e”后面的命令,而不是通过mysql连接登录到mysql的交互式界面。

          应用场合:运维工程师要写mysql检查和监控脚本中要用到。

          下面是例子:

举例1:

wKioL1jaEP7w4QFuAAGDMThfvLw388.jpg

举例2:

通过脚本创建数据库、表以及对表进行增、改、删、查操作

1)脚本内容如下:(此脚本在该博文附件有

wKiom1jaEP-jrJH2AAMHb36XOPY236.jpg

2)创建授予zhengpengfei用户可以在限定的客户端登录

wKioL1jaEQCwgXooAAB1sjVxkkI634.jpg

3)测试zhengpengfei用户连接mysql服务器(前提是mysql服务器端要在防火墙开启3306/tcp端口例外)

wKiom1jaEQCTdJSEAAGb8nMrvgQ395.jpg

4)授予脚本可执行权限,并执行脚本

wKiom1jaEQGjw5QnAAIRKZNCbyk127.jpg



②“-E” //单词vertical(垂直)缩写

          作用:使用了“-E”之后,登录之后的所有查询结果都将以纵列显示,效果等同于我们在SQL语句后面加上“\G“结尾一样。

          举例说明:

1)先创建一个数据库和一个表,并添加数据

wKioL1jaEQHxU4e2AAMCDkYUW-A381.jpg

2)把“-E”加进去查询数据

wKiom1jaEQLC8LFvAAFtojs8o5E640.jpg

③“--prompt”  //单词提示的英语单词

               作用:定制自己的mysql提示符的显示内容。一般情况下,登录mysql,是“mysql>”界面,没有其他附加信息。

               建议:将登录主机名、登录用户名、所在的数据库名、时间这四项加入到提示内容,方便运维人员和DBA管理mysql数据库。

                个人强烈建议定义的提示符:\\u@\\h:\\d\\R:\\m:\\s>

               显示结果如下:

wKioL1jaEQPDUJBgAAF8NdpAGxI715.jpg

wKioL1jaEQOR5ZBdAADbiz_tUG8575.jpg

提示符解释如下:

\u:表示用户名

\h:表示主机名

\d“表示当前数据库

\r:小时(12小时制)

\m:分钟

\s:秒

\R:小时(24小时制)

“--tee”  

作用:用来告诉mysql,要讲所有输入和输出的内容都记录进指定的文件中,方便日后检查。

方式一:

wKiom1jaEQST88MkAABI0ud6WcY022.jpg

方式二:

wKioL1jaEQWxJrAGAALk1RevXU8451.jpg

wKiom1jaEQXwwSaMAADQDEjz-ts295.jpg

方式三:

wKiom1jaEQWSwPoNAACbDZYoXrU158.jpg

2、mysqladmin

作用:提供的功能都是与mysql管理相关的各种功能

例如:mysql服务器的状态检查、各种统计信息的flush、创建/删除数据库、关闭mysql服务器等等

语法:mysqladmin  [options]  command  command    //mysqladmin  [选项]  命令  命令

说明:mysqladmin所有能做的事,大部分都能通过mysql连接登录mysql的交互式模式来完成,但是大部分还是通过mysqladmin来完成操作更加的简单方便快捷。

下面介绍几个常用的功能

1、用ping命令可以很容易的检测mysql服务器是都还能正常提供服务(alive表示是正常状态)

wKioL1jaEQaDSlIpAACq_AIknKI287.jpg

说明:如果是测试本机的mysql服务,即把截图中的192.168.1.6换成localhost即可,如果是从客户端来测试mysql服务器的mysql服务是否正常,就写mysql服务器的IP地址。同时还要注意的是:mysql服务器的防火墙要开启3306/tcp端口例外。提前需要在创建好授权用户(比如我截图中的用户“zhengpengfei”)。

2、用status命令可以获取当前的mysql服务器的基本基本的状态值

wKioL1jaEQazwBs1AACLPRavR6k139.jpg

上图中绿色部分的字段解释如下:

wKiom1jaEQaRUxKnAAIcQNaw6R8993.jpg

说明:其中的slow queries是统计慢查询SQL语句的数目的,前提是要开启慢查询功能,默认是关闭状态。

3、用processlist获取当前数据库的连接线程信息:

wKioL1jaEQfTjG4IAALxYfccflo245.jpg

说明一下:processlist经常与status联合使用:

wKiom1jaEQjQtqX1AADNno8hDKI096.jpg

下面编写一个脚本举例说明三个参数命令在mysql监控脚本中的作用:($NF表示分隔字段的最后一个字段)此脚本在该博文附件也有

wKiom1jaEQjSKmVjAAFwZ1s53Ro659.jpg

wKioL1jaEQrCapCVAAQ3MCY0XA8484.jpg

wKioL1jaEQqwKozJAAFzh76MWGg211.jpg

附加知识点(一)

wKiom1jaEQzjKku-AANi5JYtRbA116.jpg

附加知识点(二)

wKiom1jaEQyT0RqZAAIwEmmO6o8603.jpg

3、mysqldump

这个工具其功能就是将MySQL 服务器中的数据以SQL 语句的形式从数据库中dump (转储)成文本 文件。mysqldump 是做为 MySQL 的一种逻辑备份工具

4、mysqlbinlog

mysqlbinlog 程序的主要功能就是分析 MySQL Server 所产生的二进制日志(也就是 binlog)。 通过 mysqlbinlog,我们可以解析出 binlog 中指定时间段或者指定日志起始和结束位置的内容解析成 SQL 语句。

 


Mysqlslap性能测试MySQL二种存储引擎

mysqlslap是mysql自带的基准测试工具,可以模拟多个客户端同时并发的向服务器发出查询更新,给出了性能测试数据而且提供了多种引擎的性能比较,即它就是mysql的一个压力测试工具。

关于mysqlslap的一些常用的选项:

wKioL1jaEQ2SS2yMAAJ42Znwj4s772.jpg

说明:mixed是读写混合模式;csv是电子表格格式;“--number-of-queries”÷ “--concurrency”=总请求数÷并发数=每个客户端的并发数量

查看 Mysql 数据库默认最大连接数

wKiom1jaEQ2yxn6YAAFpdwHYlEk671.jpg

可以看到 mysql5.7.13 默认是 151,注:不同版本默认最大连接数不差别。一般生产环境是不够的,在 my.cnf[mysqld]下添加 max_connections=1024 增加到 1024,重启 Mysql。 修改 my.cnf 文件并重起 mysqld 服务。

wKioL1jaES6i_oalAABP52YpOBc565.jpg

查看修改后的最大连接数

wKioL1jaES-C0PsvAADEU71w_Sk927.jpg

查看 Mysql 默认使用存储引擎,如下查看:

wKiom1jaES_gOD_wAAFYlgzkEpw133.jpg

现在我们来看一下具体测试的例子

用自带的 SQL 脚本来测试::

wKioL1jaETDBqeAGAAEAYukGPPA158.jpg

显示结果如下所示:

wKiom1jaETGgFCCpAAMzNvSzLW4413.jpg

测试说明

模拟测试两次读写并发,第一次 100,第二次 200,自动生成 SQL 脚本,测试表 包含 20 个 init 字段,30 个 char 字段,每次执行 2000 查询请求。测试引擎分别是 myisam, innodb。

测试结果说明

Myisam 第一次 100 客户端同时发起增查用 1.019/s,第二次200客户端同时发起

增查用 1.079

Innodb 第一次 100 客户端同时发起增查用 1.671/s,第二次200客户端同时发起

增查用 1.669

总结:MyISAM 存储引擎处理性能是最好的(innodb性能不如myisam),也是最常用的,但不支持事务。InonDB 存储引擎提供了事务型数据引擎(ACID),在事务型引擎里使用最多的。具有事务回滚,系统修复等特点。 

wKiom1jaETGiL1CZAADKWivdioY123.jpg

将 a.csv 拷贝到 windows 主机上,打开并生成图表

wKioL1jaETKStcInAALgBoxvMNQ177.jpg


本文转自Mr大表哥 博客,原文链接:http://blog.51cto.com/zpf666/1911113     如需转载请自行联系原作者


网友评论

登录后评论
0/500
评论
技术小大人
+ 关注