MySQL - Jokacer/Learn GitHub Wiki
在程序设计语言中提出“面向对象”的概念,将客观世界看作不同类型对象构成,面向对象的方法学引入的对象、方法、实例、继承性、类以及封装性等一系列概念,数据库系统主要在两方面应用面向对象技术:数据库管理系统和数据库应用开发工具。
在进行数据存储读取时,采用面向对象的形式,即操作数据为对象,数据库会共享对象库,对象库是面向对象模型所定义对象的集合体,由于缺少较好的查询语句,所以应用不广泛。
关系型数据库是建立在关系数据库模型上的,借助集合代数等概念和方法来处理数据库中的数据,现实世界中的各个实体以及实体间的各种联系均用关系模型来表现。
关系数据库基于表的特性使用查询语言(SQL)进行查询、插入、删除和修改等操作,优点在
- 应用灵活:关系数据库的编程接口易于实现;使用SQL能在不同的产品间存储和提取信息,标准统一。
- 结构简单:关系型数据库拥有相当简洁清晰的结构,可以提供多个复杂视图。
缺点同样存在:
- 数据类型单一:只能支持简单的数据类型如整数、实数和字符串等,缺乏针对不同应用构造与之相适应的数据类型,因此在重构复杂数据的过程中可能出现额外的开销引起性能问题。
- 复杂信息查询繁琐:使用SQL语言查询复杂的信息时过程将会十分繁琐,需要非常熟悉SQL的使用;缺少指针的直接存取方式,所以查询相关信息时需要花费更多时间。
- 缺乏环境应变能力:面对系统环境的更换,关系系统成本高且修改困难,在关系型数据库与编程语言提供不一致的数据类型式,在转换过程中需要增加额外的代码。
目前将关系型数据库引入面向对象技术,既支持SQL存取和查询,并且增加了基本数据类型的数量。目前的关系型数据库大多都支持面向对象的概念,在MySQL中引入量OpenGIS(Open Geodata Interoperation Specification,OGIS-开放的地理数据互操作规范)的支持,即支持空间数据对象。
首先介绍以下数据库模块协作关系:
客户端应用程序将 SQL 语句通过某种通信方式发送到 DBMS;DBMS 通过接口接受访问和接受语句;将此语句通过内部的“查询处理”模块进行语法、词法检查;根据解析出来的结果,DBMS 生成大量查询计划并从其中选取最高效的查询计划;最后执行查询计划,并访问数据存储文件。
主要关键目录:
- client
客户端程序所在目录,包括密码确认、SSL连接可行性检查等功能。 - storage
该目录包含MySQL各类存储引擎代码,MySQL实现了一个抽象接口层:handler(sql/handler.h),其中定义量一些接口函数,存储引擎需要实现这些函数才能被系统调用。 - mysys目录
该目录包含了对于系统调用的封装,能实现平台间的跨越,该目录是一个功能库文件,包含了文件打开、数据读写、内存分配等功能。 - sql目录
该目录包含量数据库的主程序mysqld,是MySQL源代码中需要经常变化的目录之一,大多数已存在的bug也来自这个目录文件。该目录中的文件包含量对各类SQL语句的解析和实现,其中sql_lex.cc 是词法解析模块,sql_yacc.yy 是语法解析模块,这两个文件决定了 MySQL 如何解析输入的字符流和 SQL 语句。并最终获得解析树。目录中还包含了存储引擎接口模块的代码(handler)。 - vio目录
vio(virtual I/O)目录封装量virtual I/O接口,主要是封装了各种协议的网络操作。
各源代码文件夹的用途如执行流所示
MySQL开源,没有自己的专用的存储引擎,插件式存储引擎式MySQL数据库系统显著的特点之一,数据库专业人员可以根据数据读取模式的需求选择专门的存储引擎。要添加一个新的引擎,就必须重新编译MYSQL。MySQL存储引擎如图
MySQL使用各种技术把不同的数据存储在文件或者内存之中,每一种存储技术都能够提供大量的功能,并且拥有各自不同的索引技巧、锁定水平和存储机制用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务。为了能够有效的提高运行的速度,改善应用的整体性能,选择合理的存储技术是很重要的。在MySQL中,这些存储技术以及与之相适应的各种功能被称作存储引擎
,也可称为表类型,插件式存储引擎体系结构如图
其中最常用的存储引擎是MyISAM
和InnoDB
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是具有可回滚和妨崩溃能力的事务型存储引擎,使用行级锁,在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