数据库的由来和基本概念
【一】数据的发展史
- 早期未出现互联网前,每个人都只可以在本地存储,且存储的数据格式都是根据每个人的需要自由定义的
- 出现网络后,可以在局域网内进行多台计算机的数据共享,而这时,数据的格式只能由人为约束,约定俗成好一套数据存储结构,以方便数据间交互
- 在出现互联网后,可以通过一台服务器为客户端发送数据,客户端向服务端发送数据来进行数据交互,而如果该服务端发生意外宕机,建立在该服务器上的所有功能都将出现错误
- 所以,出现了数据库
- 数据库可以简单的理解为,是一台专门用来存储数据的服务器
【二】数据存储和数据库的发展史
数据存储的发展史:
- 平面文件存储(1950s): 初始阶段,数据通常存储在平面文件中。每个文件包含简单的文本记录,数据之间没有结构化的关联。
- 序列文件系统(1960s): 随着计算机系统的发展,出现了序列文件系统,允许按顺序访问存储在文件中的记录。
- 层次数据库模型(1960s): 数据库的概念开始出现,其中层次数据库模型被提出。这个模型使用树状结构组织数据,但存在层次复杂性。
- 关系数据库模型(1970s): 基于关系代数的关系数据库模型开始流行,Edgar F. Codd 提出了关系型数据库的理论基础。IBM的System R和Ingres等关系数据库管理系统(RDBMS)开始应用。
- SQL语言(1970s): 结构化查询语言(SQL)成为关系数据库管理系统中的标准查询语言,使得对关系数据库进行查询和操作更为方便。
- 物理数据独立性(1980s): 数据库管理系统越来越强调物理数据独立性,这使得数据库的逻辑设计和物理实现能够相对独立。
- 客户端-服务器体系结构(1990s): 数据库应用逐渐采用客户端-服务器模型,将数据存储和处理分离,提高了系统的灵活性和可伸缩性。
- 分布式数据库系统(2000s): 随着互联网的普及,分布式数据库系统变得更加重要。NoSQL数据库(例如MongoDB、Cassandra等)开始崭露头角,适用于大规模、非结构化或半结构化的数据。
- 云数据库(2010s至今): 云计算的兴起推动了数据库服务的发展,云数据库服务如Amazon RDS、Azure SQL Database等提供了灵活、弹性、易于管理的解决方案。
数据库的发展史:
- 网络数据库(1960s): 初始阶段,使用网络数据库模型,如CODASYL,该模型使用网络结构来表示数据之间的关系。
- 层次数据库(1960s): 层次数据库模型成为数据库管理系统的主流。其中,IBM的IMS(Information Management System)是一个著名的层次数据库系统。
- 关系数据库(1970s): Codd 提出关系数据库模型,后来的关系数据库管理系统如Oracle、IBM DB2、Microsoft SQL Server等应运而生。
- 面向对象数据库(1980s): 随着面向对象编程的兴起,出现了面向对象数据库,将面向对象的概念引入数据库管理系统。Object-oriented database systems(OODBMS)如ObjectStore、db4o等。
- 多模型数据库(2000s): 一些数据库系统开始采用多模型的方法,可以支持关系型、文档型、图形数据库等多种数据模型。例如,ArangoDB支持多模型数据库。
- NoSQL数据库(2000s至今): NoSQL数据库兴起,适用于大规模、分布式、非结构化或半结构化数据。主要类型包括文档型、键值对、列族型、图形数据库等。
- NewSQL数据库(2010s至今): NewSQL数据库试图提供与传统关系数据库相同的可靠性和事务一致性,同时通过改进性能和可伸缩性来满足大规模分布式环境中的需求。
- Serverless数据库(2020s): Serverless数据库服务进一步简化了数据库管理,使用户无需管理底层基础设施,只需专注于应用程序和数据。
【三】数据库的分类
【1】关系型数据库
关系型数据库(RDBMS)是一种基于关系模型的数据库管理系统,使用表格(表)和关系来组织和存储数据。这种类型的数据库管理系统是为了满足关系模型的基本原则,其中数据以表格的形式呈现,表格之间通过关系建立联系。以下是关系型数据库的主要特征和组成部分:
特征:
- 表格结构: 数据以表格(表)的形式组织,每个表都有列和行。每一列表示表中的一个属性,而每一行表示表中的一条记录。
- 关系: 表格之间建立关系,关系通过主键和外键来定义。主键是唯一标识表中记录的一列,而外键是与其他表的主键关联的列。
- SQL语言: 结构化查询语言(SQL)是用于管理和查询关系型数据库的标准语言。SQL提供了插入、更新、删除和查询数据的功能。
- ACID属性: 关系型数据库通常满足ACID(原子性、一致性、隔离性、持久性)属性,确保数据库操作的可靠性和一致性。
- 数据完整性: 通过各种约束(主键、外键、唯一约束等)来维护数据的完整性,确保数据的准确性和一致性。
- 事务处理: 关系型数据库支持事务处理,允许一系列数据库操作被看作一个原子单元,要么全部执行成功,要么全部失败。
组成部分:
- 表格(Table): 数据以表格的形式存储,每个表有一个唯一的名称,包含列和行。
- 列(Column): 表中的每一列表示一个属性,定义了该属性的数据类型。
- 行(Row): 表中的每一行表示一条记录,包含了对应列的具体数值。
- 主键(Primary Key): 表中的主键是一列或一组列,用于唯一标识表中的每一行。
- 外键(Foreign Key): 外键是表中的一列,建立了与另一表中主键的关联。
- 索引(Index): 为表中的列创建索引,以提高查询性能。
- SQL引擎: 负责解释和执行SQL查询,确保数据的正确性和一致性。
- 事务管理器(Transaction Manager): 管理事务的提交和回滚,确保事务的原子性和一致性。
- 数据字典(Data Dictionary): 存储数据库的元数据信息,包括表结构、列信息等。
一些流行的关系型数据库管理系统包括:
- MySQL: 开源的关系型数据库,广泛应用于各种应用场景。
- PostgreSQL: 强调扩展性和标准支持的开源数据库系统。
- Oracle Database: 商业级关系型数据库管理系统,用于大型企业应用。
- Microsoft SQL Server: 由微软提供,适用于Windows环境。
关系型数据库在处理结构化数据、复杂查询和事务处理方面表现出色,适用于需要数据一致性和强事务支持的应用场景。
【2】非关系型数据库
非关系型数据库(NoSQL)是一类不采用传统关系型数据库模型的数据库管理系统。与关系型数据库不同,NoSQL数据库具有更灵活的数据模型,适用于处理大量非结构化或半结构化数据。以下是NoSQL数据库的主要特征和常见类型:
特征:
- 灵活的数据模型: NoSQL数据库不强制采用表格的结构,可以使用多种数据模型,包括文档型、键值对、列族型、图形数据库等。
- 分布式存储: NoSQL数据库通常设计为可水平扩展的系统,能够在多台计算机上分布存储和处理数据。
- 高性能和可伸缩性: 针对大规模数据和高并发访问的需求,NoSQL数据库提供高性能和可伸缩性。
- 无固定模式: NoSQL数据库允许动态地添加字段,而不需要事先定义表结构。
- 适用于多样化的数据: 适用于存储各种形式的数据,包括文本、图像、日志、地理位置数据等。
常见类型:
- 文档型数据库(Document Stores):
- 以文档为基本存储单元,通常使用类似JSON或XML的格式表示文档。
- 例子:MongoDB、CouchDB。
- 键值对数据库(Key-Value Stores):
- 数据以键值对的形式存储,适合存储简单的数据结构。
- 例子:Redis、Amazon DynamoDB。
- 列族型数据库(Wide-Column Stores):
- 数据按列族存储,适合存储大规模的分布式数据。
- 例子:Apache Cassandra、HBase。
- 图形数据库(Graph Databases):
- 数据以图的形式存储,适用于处理复杂的关系型数据。
- 例子:Neo4j、ArangoDB。
- 对象数据库(Object Databases):
- 将对象直接存储在数据库中,适用于面向对象编程。
- 例子:db4o、ObjectDB。
NoSQL数据库在大数据、实时分析、云计算等领域得到广泛应用。它们的设计目标是满足高度可伸缩性、灵活性和性能需求,尤其在面对非结构化和半结构化数据时表现出色。
【四】SQL语句的类型
【1】为什么要对SQL语句进行分类
SQL语句的类型区分主要是基于其功能和操作的数据库对象的不同。不同的SQL语句用于执行不同的任务,涵盖了数据库的多个方面。以下是一些主要原因:
- 清晰的职责分离: SQL语句的类型区分有助于在数据库管理中实现清晰的职责分离。DDL用于定义数据库的结构,DML用于操作数据,DCL用于管理权限,TCL用于管理事务。这样的分离使得在数据库开发和管理中能够更容易理解和组织不同类型的操作。
- 权限控制: 不同类型的SQL语句需要不同的权限级别。例如,DDL语句通常需要数据库管理员权限,而DML语句可能由普通用户执行。通过类型区分,可以更精确地控制用户和角色的访问权限。
- 事务管理: TCL语句用于管理事务,包括提交和回滚。通过区分事务控制语句,可以更容易地处理数据库事务,并确保数据的一致性和完整性。
- 数据操作和查询: DML语句用于插入、更新、删除和查询数据,是数据库中最常用的操作之一。通过将这些操作与DDL、DCL和TCL语句区分开来,可以更好地组织和优化查询,提高数据库的性能。
- 语法和语义的区别: 不同类型的SQL语句有不同的语法和语义。DDL语句通常涉及表的创建和修改,而DML语句关注数据的操纵。这种区别使得SQL语句更具可读性和易维护性。
总体而言,SQL语句的类型区分有助于数据库管理系统更有效地执行不同的任务,并提供了更灵活、可扩展和安全的数据库管理体系。这种区分使得在不同的数据库场景中更容易选择和执行适当类型的操作。
【2】SQL语句的类型
【2.1】DDL(Data Definition Language):数据定义语言
- DDL语句用于定义数据库结构,包括创建、修改和删除数据库对象(表、索引、视图等)。
- 常见DDL语句包括:CREATE(创建)、ALTER(修改)、DROP(删除)等。
【2.2】DML(Data Manipulation Language):数据操纵语言
- DML语句用于操作数据库中的数据,包括查询、插入、更新和删除操作。
- 常见DML语句包括:SELECT(查询)、INSERT(插入)、UPDATE(更新)、DELETE(删除)等。
【2.3】DCL(Data Control Language):数据控制语言
- DCL语句用于设置和管理数据库的访问权限和安全性。
- 常见DCL语句包括:GRANT(授权)、REVOKE(撤销权限)等。
【2.4】TCL(Transaction Control Language):事务控制语言
- TCL语句用于管理事务处理,包括提交和回滚事务。
- 常见TCL语句包括:COMMIT(提交)、ROLLBACK(回滚)等。
【五】MySQL
【1】MySQL安装
【2】MySQL主要文件介绍
bin文件夹:
- 该文件夹包含了MySQL的可执行文件,如
mysql.exe
、mysqld.exe
等。这些文件用于启动MySQL服务器和客户端工具。
data文件夹:
- MySQL数据库文件的默认存储位置。数据库的实际数据和表结构信息存储在这个文件夹中。
- 该文件夹如果在安装后未创建,需要自行创建
my.ini或my.cnf文件:
- 这是MySQL的配置文件。它包含了MySQL服务器的配置信息,如端口号、字符集设置、日志文件路径等。
error log文件:
- MySQL错误日志文件,记录了MySQL服务器的错误信息和警告。日志文件的路径可以在配置文件中设置。
slow query log文件:
- 如果启用了慢查询日志,MySQL会将慢查询的信息记录在这个文件中。慢查询日志对于性能调优非常有用。
plugins文件夹:
- 存放MySQL的插件文件。插件可用于扩展MySQL的功能,如认证插件、存储引擎插件等。
lib文件夹:
- 包含MySQL库文件,用于支持MySQL服务器和相关工具的正常运行。
share文件夹:
- 存放共享的数据和语言文件,如字符集文件和错误消息文件。
scripts文件夹:
- 包含一些用于启动和管理MySQL服务器的脚本文件,如
mysqld_safe
等。
binlog文件夹:
- 如果启用了二进制日志,MySQL会将二进制日志文件存储在这个文件夹中。二进制日志对于数据备份和复制非常重要。
tmp文件夹:
- 用于存放临时文件的文件夹。MySQL在执行一些临时操作时可能会使用这个文件夹。
mysql_upgrade_info文件:
- 记录了MySQL升级的信息,包括当前MySQL版本号等。
【3】MySQL存储引擎
【3.1】所有支持的存储引擎
show engines;
:在命令行查看所有支持的存储引擎
【3.2】常用引擎介绍
- InnoDB:
- InnoDB是MySQL的默认存储引擎(从MySQL 5.5.5版本开始)。它支持事务、行级锁、外键等特性,适用于要求事务支持和高并发读写的应用场景。
- MyISAM:
- MyISAM是MySQL的另一个常见的存储引擎。它不支持事务和行级锁,但对于读密集的应用,以及不要求事务支持的简单数据存储,可能具有较好的性能。
- MEMORY:
- MEMORY存储引擎将表中的数据存储在内存中,适用于对速度要求很高的临时表和缓存表。但是,由于数据存储在内存中,系统重启或崩溃会导致数据丢失。
- BLACKHOLE:
- BLACKHOLE存储引擎将写入的数据丢弃,而对于读取请求,它返回一个空集。主要用于复制和分发数据的场景。
【3.2.1】其他引擎概要补充
- CSV:
- CSV存储引擎以纯文本形式存储数据,适用于需要轻量级数据交换的场景,但不适合大规模数据存储和复杂查询。
- ARCHIVE:
- ARCHIVE存储引擎压缩数据,适用于大量历史数据的归档和查询场景。但由于不支持索引和事务,不适合实时操作。
- Federated:
- Federated存储引擎允许在一个MySQL服务器上操作其他MySQL服务器上的表。适用于需要在分布式环境中查询数据的场景。
- NDB Cluster:
- NDB Cluster存储引擎用于MySQL Cluster,支持水平扩展和高可用性。适用于分布式存储和实时应用。
【3.3】常用引擎存储文件详情
-- 创建数据库
create database db1;
use db1; -- 使用该数据库
-- 创建表
-- 创建innodb引擎下的表
create table t1(id int) engine=innodb;
-- 创建myisam引擎下的表
create table t2(id int) engine=myisam;
-- 创建blackhole引擎下的表
create table t3(id int) engine=blackhole;
-- 创建memory引擎下的表
create table t4(id int) engine=memory;
-
对于不同的存储引擎,硬盘中保存的文件个数也是不一样的
-
InnoDB:2个文件
- .frm 存储表结构
- .ibd 存储数据和索引
-
MyISAM:3个文件
- .frm 存储表结构
- .MYD 存储的是表数据
- .MYI 存索引(当成是字典的目录,加快查询速度)
-
MEMORY / BLACKHOLE:1个文件
- .frm 存储表结构
-
【3.3.1】其他存储引擎(了解)
- CSV:
- CSV存储引擎使用纯文本文件存储数据,通常是以.csv为扩展名的文件。每个表对应一个.csv文件。
- ARCHIVE:
- ARCHIVE存储引擎使用压缩文件来存储数据。每个ARCHIVE表对应一个.arz扩展名的文件。
- BLACKHOLE:
- BLACKHOLE存储引擎不会在磁盘上存储实际数据,因此没有相关的物理文件。
- Federated:
- Federated存储引擎不存储实际数据,而是通过网络连接访问其他MySQL服务器上的表,因此没有相关的物理文件。
- NDB Cluster:
- NDB Cluster存储引擎使用内存来存储数据,每个数据节点在集群中存储一份数据。因此,与其他存储引擎不同,NDB Cluster不涉及直接的磁盘文件。
【4】补充知识
【4.1】information_schema:系统数据库
【4.1.1】什么是information_schema
information_schema
是MySQL数据库中的一个系统数据库,用于存储关于数据库和其对象(如表、列、索引等)的元数据信息。它包含一系列的视图(views)、表(tables)和存储过程(stored procedures),这些对象提供了对数据库结构和状态的详细查询。
以下是一些常见的information_schema
中的对象:
- TABLES 表:
- 存储有关数据库中所有表的信息,如表名、表类型、存储引擎等。
- COLUMNS 表:
- 包含数据库中所有表的列信息,如列名、数据类型、是否为主键等。
- STATISTICS 表:
- 提供有关表的索引和索引列的统计信息。
- SCHEMATA 表:
- 包含有关数据库的信息,如数据库名称、字符集、排序规则等。
- VIEWS 视图:
- 包含有关数据库中所有视图的信息。
- ROUTINES 表:
- 存储有关存储过程和函数的信息。
- 通过查询
information_schema
,用户可以获取有关数据库结构和状态的元数据信息,这对于数据库管理和优化非常有用。
-- 例如,可以使用以下查询从information_schema中获取表的列信息:
SELECT table_name, column_name, data_type
FROM information_schema.columns
WHERE table_schema = 'db1';
-- 返回指定数据库中所有表的列名、数据类型等信息。
【4.1.1】查看系统数据库
- 通过
show databases
可以看到第一个数据库为information_schema
【4.1.2】为什么在data文件夹中看不到
-
在data文件夹中看不到是因为
information_schema
数据库中的元数据信息是以表的形式存储在磁盘上的,而查询时会动态地将所需的数据加载到内存中进行处理。
-
具体来说,
information_schema
中的表和视图的数据并不是以文件形式存储在磁盘上的,而是通过 MySQL 服务器内部的数据结构动态生成的。这些数据结构包含了关于数据库、表、列、索引等元数据的信息。当你查询information_schema
中的信息时,MySQL 会根据需要动态地生成这些元数据,而不是直接读取磁盘上的文件。 -
当你执行查询时,MySQL会根据需要将相关的元数据信息从磁盘读取到内存中进行处理。这样的设计使得元数据的存储更灵活,不需要将所有元数据一直保持在内存中,特别是当数据库中的表数量庞大时。