数据库知识全解析:从基础概念到MySQL实战
1. 数据库概念
1.1 什么是数据库
数据库是按照特定数据结构组织、存储和管理数据的仓库,它是一个长期存储在计算机中、有组织且可共享的数据集合。虽然我们可以将数据直接存储在文件中以实现长期保存,但文件系统在数据管理方面存在诸多不足。
文件存储的弊端如下:
- 安全性差:数据容易被随意修改,易引发误操作。
- 查询困难:对于大型文件,如几个GB的文档,要快速查找特定字段,需先读取文件再遍历,效率极低。
- 海量数据处理不便:数据量过大时,文件体积会急剧膨胀。
- 程序控制繁琐:读取文件数据需借助文件流,操作复杂。
相比之下,数据库具有简单、高效、可靠的数据管理特性。它采用客户端(Client)-服务器(Server)模式,属于基于CS模式的网络服务。用户只需通过客户端向服务器发送SQL语句,即可获取结果,十分便捷。以MySQL为例,安装后启动的mysqld就是服务器,登录MySQL实际上就是登录客户端。其中,mysqld中的“d”代表daemon(守护进程),这是一种特殊的进程,其父进程为1号进程(系统进程),无需依赖bash进程,可直接在后台运行,从而实现持续运行。可以说,MySQL是由客户端、服务器和磁盘共同组成的服务体系。
1.2 数据库存储介质
MySQL数据库将数据存储在磁盘中,属于磁盘数据库。磁盘数据库在持久化保存方面具有明显优势,但会增加IO次数。为提高存储效率,它拥有自身的缓存机制,即高效IO。
除了磁盘数据库,还有内存数据库(又称主存数据库),如Redis。内存数据库将数据存储在内存中,其最大优点是数据读写速度极快,可显著提高操作效率。不过,内存数据库并非完全不使用磁盘。例如,数据库的启动信息和初始数据需存储在磁盘中,而涉及操作的数据则存储在内存中进行直接运算。为防止数据丢失,内存数据库通常会定期将数据转存到磁盘,以确保持久化存储。磁盘数据库和内存数据库都是数据库管理系统的存储方式,各有特点和适用场景。
1.3 常见数据库
以下是几种常见的数据库:
- SQL Server:微软的产品,深受.Net开发者喜爱,适用于中大型项目开发。
- Oracle:甲骨文公司推出的产品,适合大型项目或具有复杂逻辑的项目,但并发性能一般不如MySQL。
- MySQL:由瑞典公司MySQL AB开发,是世界上最受欢迎的数据库之一,并发性能好,对简单SQL处理效果好,适用于电商、SNS、论坛等项目开发,后被甲骨文公司收购。其风靡全球的重要原因之一是免费,深受广大开发者喜爱。
- PostgreSQL:起源于加州大学伯克利分校的计算机科学系,是一个独立、开源的数据库管理系统,由全球志愿者开发和维护,无论是私用、商用还是学术研究,都可免费使用、修改和分发。
- SQLite:由Dwayne Richard Hipp于2000年创建,是一种轻量级、嵌入式的关系型数据库,遵循ACID原则(原子性、一致性、隔离性、持久性),占用资源极低,仅需几百KB,广泛用于移动应用、嵌入式系统、桌面应用、Web浏览器、游戏等各种应用程序中。
- H2:一种由纯Java编写的轻量级嵌入式关系型数据库管理系统,以嵌入式库的形式存在,适用于Java应用程序的内部嵌入。虽然它不适用于大规模或高并发的生产数据库,但对于小型项目和原型开发非常有用。
2. 数据库基本操作
2.1 连接数据库
连接数据库前,需确保MySQL服务已启动。连接数据库的命令如下:
mysql -u 用户 -p -h IP地址 -P 端口 |
其中:
- “-u”后跟想要登录MySQL的用户名,如root。
- “-p”表示使用密码登录,可紧跟密码,也可回车后输入。
- “-h”表示MySQL服务部署机器的IP地址。
- “-P”表示MySQL服务进程所使用的端口号。
若直接在云服务器中登录,可不指定“-h”和“-P”,且当前只有一个root用户时,只需执行以下命令即可连接数据库:
mysql -u root -p |
输入密码后,若出现“mysql>”,则表示登录成功。
2.2 使用数据库
- 查看数据库:查看当前MySQL系统中有哪些数据库,可使用以下命令:
mysql> show databases; |
注:Test是之前创建的数据库,其他数据属于系统数据库,不可删除。
- 创建数据库:创建一个名为DataBase1的数据库,命令如下:
mysql> create database DataBase1; |
MySQL运行所产生的数据都存储在/var/lib/mysql目录中,新建一个数据库,实际就是在mysql目录中新建一个目录(文件夹)。查看此目录需先退出MySQL(直接输入“quit”退出),且因是系统级文件,需借助root身份才能查看,命令如下:
ll /var/lib/mysql |
- 使用数据库:MySQL中有多个数据库,在进行建表、查询等操作前,需先指明使用哪一个数据库,命令如下:
mysql> use DataBase1; |
执行指令后,可通过函数判断是否成功,命令如下:
mysql> select database(); |
结果显示正常,证明当前正在使用DataBase1数据库。
- 创建表:创建一张表T1,包含序号、姓名两个列属性,命令如下:
mysql> create table T1 |
( |
id int, |
name varchar(32) |
); |
创建表后,可查看表的详细信息,同时验证表是否已创建成功,命令如下:
mysql> desc T1; |
表结构中有很多属性,现在可先不用管具体含义,只需知道当前存在一个int和varchar类型的字段即可。若想进行清屏操作,可使用“system clear”命令,命令如下:
mysql> system clear |
创建表的本质也是创建文件,可进入之前的目录,具体进入DataBase1目录,能看到该目录下确实多了一个名为T1的相关文件,命令如下:
ll /var/lib/mysql/DataBase1 |
至于这两个文件具体是什么,需结合存储引擎来理解。
- 插入数据:有了表结构后,可向表中插入部分数据。注意,插入的数据格式要与表的格式对应,不能向不存在的字段中插入数据。现在直接进行全列插入,即插入序号、姓名两个信息,命令如下:
mysql> insert into T1 values (1, '张三'); |
mysql> insert into T1 values (2, '李四'); |
mysql> insert into T1 values (3, '王五'); |
在MySQL中,执行指令后出现“Query OK”表示指令执行成功,若出现其他提示信息,大概率是语法问题,需检查插入数据格式、标点符号是否正确。
- 查询数据:查询T1表中已经插入的数据,命令如下:
mysql> select * from T1; |
可以看到数据已成功插入T1表中。创建数据库、创建表、插入数据、查询数据已覆盖绝大多数业务场景,但实际并非如此简单。例如,表结构需慎重创建,符合三大范式;查询数据时,需配合各种筛选条件进行查询,如where子句、聚合条件、多表查询等;MySQL中还提供了高效的数据管理机制,如索引、事务、权限管理,具体细节需慢慢学习。
2.3 服务器、数据库、表关系
在使用MySQL时,执行结果总是以行、列形式呈现,这是因为行列构成表,而MySQL中一切皆为表。这种行列式结构最大的优点是直观,便于快速查看数据信息。其中,行代表数据信息,列代表数据属性。
与之前MySQL知识进行串联,可得出结论:用户登录客户端,向服务器发出指令,创建数据库的本质是创建目录(文件夹),创建表的本质是在数据库中创建文件,插入数据就是往文件中写入数据,查询结果时以行列式呈现,表是MySQL中最常见、最常用的结构。一个数据库中不只存在一张表,SQL指令执行结果也可看作一张表。
3. MySQL语句分类
MySQL中的语句可分为三类:
- DDL(数据定义语句):用于维护存储数据的结构,常用于对数据库、表进行操作。
- DML(数据操纵语句):用于对数据进行操作,如对表中的数据进行增删改查。其中还细分出一个DQL(数据查询语句),例如查询时携带的各种条件。
- DCL(数据控制语句):主要负责权限和事务的管理,可给用户赋予数据库的权限。
4. MySQL架构
MySQL是一个可移植的数据库,可在几乎所有操作系统上运行,但主要在Linux类似的服务器后端中运行。得益于优秀的分层设计,MySQL能保证在各个平台运行时,物理体系结构的一致性。大体可分为三层:
- 第一层:解决安全和连接管理问题。
- 第二层:进行词法、语法分析以及SQL语句优化。
- 第三层:完成数据的存储方案。
5. 存储引擎
存储引擎是数据库系统如何存储数据、为存储的数据建立索引和更新、查询数据等技术的实现方法。MySQL的核心是插件式存储引擎,支持多种存储引擎。
5.1 查看存储引擎
MySQL中可选择使用不同的存储引擎,不同存储引擎的效果不同,可理解为汽车引擎,V6、水平对置、W12、转子马达之间存在差异。查看当前支持哪些存储引擎,可使用以下命令:
mysql> show engines; |
若觉得不方便查看,可输入“mysql> show engines \G;”表示格式化显示。当前MySQL支持的存储引擎有很多,可查看创建数据库时默认使用的存储引擎,查看配置文件“vim /etc/my.cnf”即可。这其实就是当时配置my.cnf时指定的存储引擎InnoDB,也是MySQL中常用的存储引擎之一。也可在表创建成功后,查看使用了哪个引擎,命令如下:
mysql> show create table T1; |
创建表时,若不指定,就使用my.cnf中的默认存储引擎;若指定了,就使用用户指定的存储引擎,可根据实际业务场景决定,非常灵活。
5.2 存储引擎间的区别
存储引擎 | 事务支持 | ACID兼容性 | 锁定级别 | 数据表类型 | 支持的索引类型 | 外键约束 | 全文搜索 | 备注 |
---|---|---|---|---|---|---|---|---|
InnoDB | 是 | 是 | 行级锁 | 事务表 | B+Tree、全文 | 是 | 是 | MySQL默认存储引擎,适用于事务处理 |
MRG_MYISAM | 否 | 否 | 表级锁 | 非事务表 | BTree | 否 | 否 | 合并(合并式)存储引擎,不常用 |
MEMORY | 是 | 是 | 表级锁 | 临时表 | 哈希表 | 否 | 否 | 将数据存储在内存中,适用于临时数据 |
BLACKHOLE | 否 | 否 | 表级锁 | 非事务表 | 无 | 否 | 否 | 黑洞存储引擎,丢弃所有写入数据 |
MyISAM | 否 | 否 | 表级锁 | 非事务表 | BTree、全文 | 否 | 是 | 早期MySQL默认存储引擎,性能较快 |
CSV | 否 | 否 | 表级锁 | 非事务表 | 无 | 否 | 否 | 存储数据以逗号分隔值(CSV)格式 |
ARCHIVE | 否 | 否 | 表级锁 | 非事务表 | 无 | 否 | 否 | 用于存储归档数据,数据压缩比较高 |
PERFORMANCE_SCHEMA | 否 | 否 | 无锁定 | 系统表 | 无 | 否 | 否 | 用于性能监控和分析系统性能 |
FEDERATED | 是 | 是 | 表级锁 | 非事务表 | 无 | 是 | 否 | 用于访问远程数据库的存储引擎 |
存储引擎有很多,主要记住两个即可:InnoDB和MyISAM。这两个数据库几乎覆盖了80%的业务场景,它们之间的区别很简单:InnoDB适合需要事务支持、数据完整性和高并发性能的应用;MyISAM可能适用于只读数据、全文搜索或特定用途的应用。