MySQL - Jokacer/Learn GitHub Wiki

数据库系统分类

面向对象

在程序设计语言中提出“面向对象”的概念,将客观世界看作不同类型对象构成,面向对象的方法学引入的对象、方法、实例、继承性、类以及封装性等一系列概念,数据库系统主要在两方面应用面向对象技术:数据库管理系统和数据库应用开发工具。

在进行数据存储读取时,采用面向对象的形式,即操作数据为对象,数据库会共享对象库,对象库是面向对象模型所定义对象的集合体,由于缺少较好的查询语句,所以应用不广泛。

关系型数据库

关系型数据库是建立在关系数据库模型上的,借助集合代数等概念和方法来处理数据库中的数据,现实世界中的各个实体以及实体间的各种联系均用关系模型来表现。

关系数据库基于表的特性使用查询语言(SQL)进行查询、插入、删除和修改等操作,优点在

  1. 应用灵活:关系数据库的编程接口易于实现;使用SQL能在不同的产品间存储和提取信息,标准统一。
  2. 结构简单:关系型数据库拥有相当简洁清晰的结构,可以提供多个复杂视图。

缺点同样存在:

  1. 数据类型单一:只能支持简单的数据类型如整数、实数和字符串等,缺乏针对不同应用构造与之相适应的数据类型,因此在重构复杂数据的过程中可能出现额外的开销引起性能问题。
  2. 复杂信息查询繁琐:使用SQL语言查询复杂的信息时过程将会十分繁琐,需要非常熟悉SQL的使用;缺少指针的直接存取方式,所以查询相关信息时需要花费更多时间。
  3. 缺乏环境应变能力:面对系统环境的更换,关系系统成本高且修改困难,在关系型数据库与编程语言提供不一致的数据类型式,在转换过程中需要增加额外的代码。

目前将关系型数据库引入面向对象技术,既支持SQL存取和查询,并且增加了基本数据类型的数量。目前的关系型数据库大多都支持面向对象的概念,在MySQL中引入量OpenGIS(Open Geodata Interoperation Specification,OGIS-开放的地理数据互操作规范)的支持,即支持空间数据对象。

MySQL数据库体系

首先介绍以下数据库模块协作关系:

数据库模块协作图

客户端应用程序将 SQL 语句通过某种通信方式发送到 DBMS;DBMS 通过接口接受访问和接受语句;将此语句通过内部的“查询处理”模块进行语法、词法检查;根据解析出来的结果,DBMS 生成大量查询计划并从其中选取最高效的查询计划;最后执行查询计划,并访问数据存储文件。

MySQL代码目录

主要关键目录:

  1. client
    客户端程序所在目录,包括密码确认、SSL连接可行性检查等功能。
  2. storage
    该目录包含MySQL各类存储引擎代码,MySQL实现了一个抽象接口层:handler(sql/handler.h),其中定义量一些接口函数,存储引擎需要实现这些函数才能被系统调用。
  3. mysys目录
    该目录包含了对于系统调用的封装,能实现平台间的跨越,该目录是一个功能库文件,包含了文件打开、数据读写、内存分配等功能。
  4. sql目录
    该目录包含量数据库的主程序mysqld,是MySQL源代码中需要经常变化的目录之一,大多数已存在的bug也来自这个目录文件。该目录中的文件包含量对各类SQL语句的解析和实现,其中sql_lex.cc 是词法解析模块,sql_yacc.yy 是语法解析模块,这两个文件决定了 MySQL 如何解析输入的字符流和 SQL 语句。并最终获得解析树。目录中还包含了存储引擎接口模块的代码(handler)。
  5. vio目录
    vio(virtual I/O)目录封装量virtual I/O接口,主要是封装了各种协议的网络操作。

各源代码文件夹的用途如执行流所示

存储引擎

MySQL开源,没有自己的专用的存储引擎,插件式存储引擎式MySQL数据库系统显著的特点之一,数据库专业人员可以根据数据读取模式的需求选择专门的存储引擎。要添加一个新的引擎,就必须重新编译MYSQL。MySQL存储引擎如图

MySQL使用各种技术把不同的数据存储在文件或者内存之中,每一种存储技术都能够提供大量的功能,并且拥有各自不同的索引技巧、锁定水平和存储机制用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务。为了能够有效的提高运行的速度,改善应用的整体性能,选择合理的存储技术是很重要的。在MySQL中,这些存储技术以及与之相适应的各种功能被称作存储引擎,也可称为表类型,插件式存储引擎体系结构如图

其中最常用的存储引擎是MyISAMInnoDB

MyISAM存储引擎

MyISAM 存储引擎是通过 ISAM 功能增强之后得到的,处理非事务安全的表,它能够提供高速的存储与检索,并且具有全文检索的能力。任何一个 MyISAM 表都被存储在三个文件之中:索引存储在.MYI 文件中,数据存储在.MYD 文件中,而表的定义则存储在.frm文件中。

MyISAM存储引擎有如下特点:

  • 数据存储时低字节置于前面
  • 所有数字键值都以高字节先存储,以允许更好的索引压缩
  • 支持大文件系统
  • 能通过自动合并相邻被删除块减少行碎片
  • 每个MyISAM表的最大索引数为64。每个索引的列数上限为16,可以通过重新编译MySQL来设定
  • BLOB 和 TEXT 列也可以被索引,被索引的列允许为 NULL 值
  • 支持每个表一个AUTO_INCREMENT列的内部处理。 MyISAM自动更新此列以进行INSERT和UPDATE操作。 这使AUTO_INCREMENT列更快(至少10%),序列顶部的值在删除后不会重复使用

MyISAM的数据文件存放在.MYD为扩展名的文件中,支持三种不同的存储格式:静态表动态表压缩表

静态表每行采用固定数值的字节数进行存储,不包含BLOB、TEXT等可变列元素,特点为速度快,易于缓存,系统崩溃后容易重构,由于行位置固定,相较于动态表需要更多的存储空间。

动态表含有可变长度的列,比静态表复杂,特征为:所有字符串类型的列都是可变长的;每一行都有一副位图先说明哪些列中包含空字符串,或者哪些列是 0,如果字符串型的列在除去尾部之后长度为 0,或者数字型列的值为 0,该列就会被标记在位图中,而不存储在磁盘中,非空字符串按照长度加字符串内容存储;动态存储格式所占用空间比固定长度的表占用空间小,然而由于拆分过长的行,会导致碎片产生,在系统崩溃后也更难还原。

压缩表存储格式是 myisamchk 工具创建的一种只读格式,压缩后的表可以通过 myisamchk 命令解压缩,所占用的空间较小,访问开销也小

MyISAM 存储引擎的每个表都对应一个索引文件,索引文件包含两部分:头部信息和索引值。

头部信息记录了该表的索引选项、索引文件大小和索引定义,头部信息格式如图

索引值是按页面(Page)形式存储,每一页只存储来自统一索引的值

InnoDB存储引擎

InnoDB是具有可回滚和妨崩溃能力的事务型存储引擎,使用行级锁,在select语句提供多版本并发控制。InnoDB参照量Oracle的架构和功能,具备:双写入、插入缓存和适应式哈希索引的特点。

双写入:当引擎进行表空间数据写操作时数据写两次(冗余提高可靠性)

插入缓存:减少数据库在对非主索引插入数据时造成的随机读写

自适应哈希:当InnoDB观察到建立哈希索引可以提升速度,则建立哈希索引,通过B+树构造。InnoDB 存储引擎会自动根据访问的频率和模式来为某些页来建立哈希索引

InnoDB以多种格式在磁盘上存储文件,表空间可由多个文件或者裸分区进行,表空间的示意图如

innodb有两种存储方式,共享表空间存储和多表空间存储

两种存储方式的表结构和myisam一样,以表名开头,扩展名是.frm。

如果使用共享表空间,那么所有表的数据文件和索引文件都保存在一个表空间里,一个表空间可以有多个文件,通过innodb_data_file_path和innodb_data_home_dir参数设置共享表空间的位置和名字,一般共享表空间的名字叫ibdata1-n。

如果使用多表空间,那么每个表都有一个表空间文件用于存储每个表的数据和索引,文件名以表名开头,以.ibd为扩展名

区别:InnoDB自身很多良好的特点,比如事务支持、存储过程、视图、行级锁定等等,在并发很多的情况下,InnoDB的表现肯定要比MyISAM强很多。但是在不是很复杂的小型应用上,也可以继续使用MyISAM

⚠️ **GitHub.com Fallback** ⚠️