Mysql体系将结构及数据库引擎

mysql的体系结构

mysql可以分为server层和存储引擎层俩部分

server层包括连接器,查询缓存,分析器,优化器,执行器等,涵盖mysql的大多数核心服务,以及所有的内置函数(比如日期,时间,数字和加密函数)

所有跨引擎存储的功能都在这一层实现,比如存储过程,触发器,试图

触发器

触发器是一种特殊的类型存储过程,它不同于存储过程,主要通过事件除法而被执行,即不是主动调用而执行的;存储过程则需要主动调用其名字执行

触发器:trigger,是指事先为某张表绑定一段代码,当表中的某些内容发生改变(增、删、改)的时候,系统会自动触发代码并执行。

  1. 可在写入数据前,强制检验或者转换数据(保证护数据安全)
  2. 触发器发生错误时,前面用户已经执行成功的操作会被撤销,类似事务的回滚
delimiter 自定义结束符号
create trigger 触发器名字 触发时间 触发事件 on 表 for each row
begin-- 触发器内容主体,每行用分号结尾
end
自定义的结束符合delimiter ;

on 表 for each:触发对象,触发器绑定的实质是表中的所有行,因此当每一行发生指定改变时,触发器就会发生

触发时间

当 SQL 指令发生时,会令行中数据发生变化,而每张表中对应的行有两种状态:数据操作前和操作后

  • before:表中数据发生改变前的状态
  • after:表中数据发生改变后的状态

PS:如果 before 触发器失败或者语句本身失败,将不执行 after 触发器(如果有的话)

触发事件

触发器是针对数据发送改变才会被触发,对应的操作只有

  • INSERT
  • DELETE
  • UPDATE

注意事项

  • 在 MySQL 5 中,触发器名必须在每个表中唯一,但不是在每个数据库中唯一,即同一数据库中的两个表可能具有相同名字的触发器
  • 每个表的每个事件每次只允许一个触发器,因此,每个表最多支持 6 个触发器,before/after insert、before/after delete、before/after update

而存储引擎层负责数据的存储和提取.其架构模式是插件式的,支持innodb,myisam,memory等多个存储引擎.从mysql5.5.5版本innodb成为了默认的存储引擎

server层

连接器

连接完成后,如果你没有后续的动作,这个连接就处于空闲状态

show PROCESSLIST;

执行命令查看连接,sleep表示空闲状态

MySQL服务器所支持的最大连接数是有上限的,因为每个连接的建立都会消耗内存,因此我们希望客户端在连接到My SQL Server 处理完相应的操作后,应该断开连接并释放占用的内存。

客户端如果太长时间没冻结,连接器就会自动将它断开 数据库连接器默认8小时断开连接

interactive_timeout:服务器关闭交互式连接前等待活动的秒数。(eg:客户端连接交互式连接)
wait_timeout:服务器关闭非交互连接之前等待活动的秒数。(eg:jdbc连接)

show VARIABLES like '%timeout%' #执行命令查看两个参数

数据库连接器默认8小时断开链接

  • 当只改wait_timeout 是不能改interactive_timeout的,wait_timeout是修改session变量,是不起作用的,当关闭此次会话,退出mysql ,重新登录发现还是原来的值:
  • 但若只改interactive_timeout,wait_timeout也会跟着改。所以修改global的interactive_timeout参数,可以真正调整超时时间。

Windows下在%MySQL HOME%/bin下有mysql.ini配置文件,需修改配置文件。

linux的服务器上的mysql:
set global interactive_timeout=31536000;
show VARIABLES like ‘%timeout%’;

用来控制mysql实例同时存在的连接数上线

SHOW variables like '%max_connections%'

一个sqlsession对应一个事物.所以是clien

查询缓存

查询缓存的失效非常频繁,只要有一个表的更新,这个表上所有的查询缓存都会被清空,可以通过query_cache_type设置.mysql8.0版本直接将查询缓存整块功能删掉了.

分析器(要做什么)

分析器会做“词法分析”,“语法分析”
eg:select写错时

优化器

优化器是在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联的时候(join),决定各个表的连接顺序

执行器

先判断一下你对这个表T也没用执行权限,如果没有,就会返回没有权限的错误

根据表引擎定义使用引擎提供的接口方法.比如触发器,只有执行阶段才能判断有无权限,不只是表面的权限检查

数据库引擎

存储引擎的概念是mysql的特点Oracle有OLTP(OnLine Transaction Processsing 联机事务处理, OLAP(OnLine Analytical Processing联机分析处理.

SHOW ENGINES; 查看mysql支持的引擎

SHOW variables like '%engine%'查看数据库默认引擎;

(1)InnoDB:支持事务处理,支持外键,支持崩溃修复能力和并发控制,并支持类似 Oracle 的非锁定读,即默认读取操作不会产生锁。支持行锁。 从 MySQL 5.5.8 版本开始是默认的存储引擎。InnoDB 通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了 SQL 标准的4种隔离级别,默认为 REPEATABLE 级别,同时使用一种称为 netx-key locking 的策略来避免幻读(phantom)现象的产生。除此之外,InnoDB 存储引擎还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead) 等高性能和高可用的功能。
(2)MyISAM:支持表锁。插入数据快,空间和内存使用比较低。如果表主要是用于插入新记录和读出记录,那么选择MyISAM能实现处理高效率。如果应用的完整性、并发性要求比 较低,也可以使用。MyISAM 存储引擎的另一个与众不同的地方是,它的缓冲池只缓存(cache)索引文件,而不缓存数据文件,这与大多数的数据库都不相同。
(3)MEMORY:所有的数据都在内存中,数据的处理速度快,但是安全性不高。如果需要很快的读写速度,对数据的安全性要求较低,可以选择MEMOEY。它对表的大小有要求,不能建立太大的表。所以,这类数据库只使用在相对较小的数据库表。
同一个数据库也可以使用多种存储引擎的表,不同引擎的表可以关联查询。如果一个表要求比较高的事务处理,可以选择InnoDB。这个数据库中可以将查询要求比较高的表选择MyISAM存储。
正如其名,Memory 存储引擎中的数据都存放在内存中,数据库重 启或发生崩溃,表中的数据都将消失。它非常适合于存储 OLTP 数据库应用中临时数据的临时表,也可以作为 OLAP 数据库应用中数据仓库的维度表。Memory 存储引擎默认使用哈希 索引,而不是通常熟悉的 B+ 树索引。
(4)NDB 存储引擎
  NDB 存储引擎是一个集群存储引擎,类似于 Oracle 的 RAC 集群,不过与 Oracle RAC 的 share everything 结构不同的是,其结构是 share nothing 的集群架构,因此能提供更高级别的 高可用性。NDB 存储引擎的特点是数据全部放在内存中(从 5.1 版本开始,可以将非索引数 据放在磁盘上),因此主键查找(primary key lookups)的速度极快,并且能够在线添加 NDB 数据存储节点(data node)以便线性地提高数据库性能。由此可见,NDB 存储引擎是高可用、 高性能、高可扩展性的数据库集群系统,其面向的也是 OLTP 的数据库应用类型。
(5)Infobright 存储引擎
第三方的存储引擎。其特点是存储是按照列而非行的,因此非常 适合 OLAP 的数据库应用。其官方网站是 http://www.infobright.org/,上面有不少成功的数据 仓库案例可供分析。
(6)NTSE 存储引擎
网易公司开发的面向其内部使用的存储引擎。目前的版本不支持事务, 但提供压缩、行级缓存等特性,不久的将来会实现面向内存的事务支持。
(7)BLACKHOLE
黑洞存储引擎,可以应用于主备复制中的分发主库。
MySQL 数据库还有很多其他存储引擎,上述只是列举了最为常用的一些引擎。如果 你喜欢,完全可以编写专属于自己的引擎,这就是开源赋予我们的能力,也是开源的魅力所在。

索引组织表,堆组织表

InnoDB 引擎把数据放在主键索引上,其他索引上保存的是主键 id。这种方式,我们称之为索引组织表(Index Organizied Table)。
而 Memory 引擎采用的是把数据单独存放,索引上保存数据位置的数据组织形式,我们称之为堆组织表(Heap Organizied Table)。

自增值保存策略

MyISAM 引擎的自增值保存在数据文件中。
InnoDB具体情况是:在 MySQL 5.7 及之前的版本,自增值保存在内存里,并没有持久化。每次重启后,第一次打开表的时候,都会去找自增值的最大值 max(id),然后将 max(id)+1 作为这个表当前的自增值。MySQL 8.0 版本后,才有了“自增值持久化”的能力,保存在了内存里。

Last modification:November 17, 2023
如果觉得我的文章对你有用,请随意赞赏