【MySQL】数据库基础
数据库基础
- 1. 数据库概念
- 2. 主流数据库
- 3. 基本使用
- 1. 连接服务器
- 2. 服务器管理
- 2. 服务器,数据库,表的关系
- 3. 数据库存储路径
- 4. 数据库基本操作
- 4. MySQL 架构
- 5. SQL 语句分类
- 6. 存储引擎
1. 数据库概念
存储数据用文件就可以了,为什么还要弄个数据库?
文件保存数据有以下几个缺点:
- 文件的安全性问题。
- 文件不利于数据查询和管理。
- 文件不利于存储海量数据。
- 文件在程序中控制不方便。
为了解决上述问题,专家们设计出更加利于管理数据的东西 - 数据库,它能更有效的管理数据。数据库的水平是衡量一个程序员水平的重要指标。
例如:MySQL 数据库中的两个核心组件 mysql 与 mysqld,基于客户端/服务器模式的一种网络服务。mysql 作为客户端提供用户界面和查询窗口,而 mysqld 作为服务器负责处理 SQL 语句和管理数据库数据。二者协同工作,共同完成数据库的各种操作。
客户端 VS 服务器
数据库是分为数据库服务器和数据库客户端的,以 MySQL 数据库为例,我们使用 MySQL 数据库时会先通过 mysql 命令连接 MySQL 服务器。如下:
这里我们使用的 mysql 命令就是 MySQL 的客户端,而 MySQL 服务器以守护进程的方式一直在后台运行,可以通过 ps 命令进行查看。如下:
这里查看到的 mysqld 就是 MySQL 的服务器,我们使用 mysql 命令实际就是在连接 mysqld 服务。通过 netstat 命令可以看到,MySQL 服务器底层采用的是 TCP6 协议,目前服务器处于监听状态。如下:
也就是说,MySQL 服务器本质是一个网络服务器,我们使用 mysql 命令连接 MySQL 服务器时,本质就是 MySQL 客户端在向 MySQL 服务器发起连接请求,连接建立成功后 MySQL 客户端就会将用户输入的 SQL 语句发送给 MySQL 服务器,之后 MySQL 服务器就会根据 SQL 语句对数据进行对应的操作,然后将结果返回给 MySQL 客户端。如下图:
数据库的存储介质
- 磁盘级数据库:MySQL
- 内存级数据库:Redis
说明一下:
- 磁盘数据库的数据主要存储在磁盘上,因此磁盘数据库在数据的持久化保存上有明显优势。但磁盘数据库为了提高数据的存储效率,也有自己对应的缓存机制,因此在某一个时刻之内,不一定所有数据都会被刷新到磁盘上。
- 内存数据库的数据主要存储在内存中,与磁盘数据库相比,内存数据库可以大大提高读取速度,减少数据库的访问时间。但内存数据库并非完全不使用磁盘,数据库的启动信息、初始数据等还是需要存储在磁盘上的,只是数据主要在内存中进行存储和运算。
- 由于内存数据库的数据存储在内存中,数据库主机掉电后数据就会丢失,因此在数据库服务关闭前通常需要把内存中的数据转储到磁盘上,甚至在内存数据库运行期间,一些数据也会持久化到磁盘存储。
2. 主流数据库
- SQL Sever:微软的产品,.Net程序员的最爱,适合中大型项目。
- Oracle:甲骨文产品,适合大型项目,复杂的业务逻辑,但并发一般来说不如 MySQL。
- MySQL:甲骨文产品,世界上最受欢迎的数据库,属于并发性好,不适合做复杂的业务。主要用在电商,SNS,论坛。对简单的SQL处理效果好。
- PostgreSQL:加州大学伯克利分校计算机系开发的关系型数据库,不管是私用,商用,还是学术研究使用,可以免费使用,修改和分发。
- SQLite:是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。
- H2:是一个用Java开发的嵌入式数据库,它本身只是一个类库,可以直接嵌入到应用项目中。
3. 基本使用
1. 连接服务器
连接 MySQL 服务器的方式如下:
解释说明:
- -h: 表示你要连接的 MySQL 服务器所在的主机,127.0.0.1 表示本主机。
- -P: 表示你要连接的 MySQL 服务器所对应的端口号,一般默认是 3306
- -u: 表示用哪一个用户连接 MySQL 服务器,root表示超级用户。
- -p: 表示该用户对应的密码,密码可以直接跟在 -p 后面,也可以回车后输入。
此外,如果要连接的是本地的 MySQL 服务器,那么连接时只需要指明用户名和用户密码即可。如下:
连接到 MySQL 服务器后,就可以输入各种 SQL 语句让服务器执行了,当要退出 mysql 时直接输入 quit 或 exit 或 \q。如下:
2. 服务器管理
停止服务器
通过 systemctl stop mysql 可以停止 MySQL 服务器,如下:
启动服务器
通过 systemctl start mysql 可以启动 MySQL 服务器,如下:
重启服务器
通过 systemctl restart mysql 可以重启 MySQL 服务器,如下:
2. 服务器,数据库,表的关系
- 所谓安装数据库服务器,只是在机器上安装了一个数据库管理系统程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。
- 为保存应用中实体的数据,一般会在数据库中创建多个表,以保存程序中实体的数据。
数据库服务器、数据库和表的关系如下:
3. 数据库存储路径
通过 MySQL 创建的数据库和各种表结构,最终会以文件的形式存储下来,通过查看 MySQL 的配置文件中的 datadir 可以得知数据文件的存储路径。
比如我的 MySQL 配置文件的绝对路径为 /etc/mysql/mysql.conf.d/mysqld.cnf,配置文件中 datadir 对应的值为 /var/lib/mysql,如下:
如果没有编码集和校验集可以设置一下
将来 MySQL 创建的数据库文件都会存储在该目录下,如下:
4. 数据库基本操作
创建数据库
连接 MySQL 服务器后,通过 create 语句创建一个名为 helloworld 的数据库,如下:
这时 /var/lib/mysql 目录下,就会多出一个名为 helloworld 的目录,如下:
使用数据库
使用数据库之前,可以先通过 show 语句查看当前都有哪些数据库,然后再通过 use 语句使用指定的数据库,如下:
使用数据库可以理解成,就是使用 cd 命令进入到该数据库对应的目录当中。
创建表
这里我们通过 create 语句在 helloworld 数据库中创建一个简单的 student 表,如下:
通过 show 语句可以查看创建的 student 表结构,如下:
在 MySQL 的数据存储路径下的 helloworld 目录下,就会多出一个文件 student.ibd,如下:
表中插入数据
通过 desc 语句可以查看对应的表结构,比如:
通过 insert 语句可以向表中插入数据,比如:
查询表中的数据
通过 select 语句可以查看表中的数据,如下:
结论:
- 创建数据库本质:在 Linux 下创建一个目录。
- 在数据库内创建表本质:在 Linux 目录中创建文件。
- 数据库的本质其实也是文件,只不过这些文件并不是由程序员直接操作,而是数据库服务 (mysqld) 帮我们进行操作。
4. MySQL 架构
MySQL 是一个可移植的数据库,几乎能在当前所有的操作系统上运行,如 Unix/Linux、Windows、 Mac 和 Solaris。各种系统在底层实现方面各有不同,但是 MySQL 基本上能保证在各个平台上的物理体系结构的一致性。
MySQL 架构主要可分为如下四层:
- 连接层:主要完成一些类似连接处理,授权认证及相关的安全方案。
- 服务层:在 MySQL 数据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断、SQL接口、SQL解析、SQL分析优化、缓存查询的处理以及部分内置函数执行等。各个存储引擎提供的功能都集中在这一层,如存储过程、触发器、试图等。
- 引擎层:由多种可拔插的存储引擎共同组成,真正负责 MySQL 中数据的存储和提取,每个存储引擎都有自己的优点和缺陷。服务层传来的 SQL 语句,通过存储引擎访问数据库的表结构,将数据进行增删查改。
- 存储层:将数据存储在裸设备的文件系统之上,完成存储引擎的交互。
MySQL 客户端
MySQL 服务器会收到 MySQL 客户端发来的 SQL 语句,并根据 SQL 语句执行对应的操作。
- 这里的 MySQL 客户端不仅仅指的是连接 MySQL 时使用的 mysql 命令,MySQL 客户端还包括语言接口客户端。
- MySQL 给各种语言提供的用于访问数据库的接口,用户通过调用这些接口也可以向 MySQL 服务器发送 SQL 语句。
mysql 命令本质是一个可执行程序,通过 file 命令可以看到该可执行程序是采用动态链接的方式生成的,通过 ldd 命令可以看到该可执行程序依赖的 C/C++ 库文件。如下:
也就是说,mysql 命令本身就是 C/C++ 编写的,因此在编写 mysql 程序时,一定需要调用 MySQL 提供给 C/C++ 的语言接口客户端。当然,MySQL 不仅仅提供了 C/C++ 对应的语言接口,像 Python、Java、PHP 等都有对应的 MySQL 接口。
5. SQL 语句分类
结构化查询语言 (SQL):一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
SQL 语句分类:
- 数据定义语言 (DDL),用来维护存储数据的结构,代表指令: create,drop,alter
- 数据操纵语言 (DML),用来对数据进行操作,代表指令: insert,delete,update
- 数据控制语言 (DCL),主要负责权限管理和事务,代表指令: grant,revoke,commit
说明:DML 中又单独分了一个数据查询语言 (DQL),代表指令: select
6. 存储引擎
存储引擎:数据库管理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法,MySQL的核心就是插件式存储引擎,支持多种存储引擎。
通过 show 语句可以查看 MySQL 支持的存储引擎。比如:
其中 MySQL 底层默认使用的存储引擎是 InnoDB,该存储引擎支持事务、行级锁、外键等。
存储引擎对比
InnoDB 存储引擎是支持事务的,而 MyISAM 存储引擎是不支持的。