目录
0. 登录
当把数据库安装部署到当前服务器上后,可以使用指令mysql -h <服务器主机的IP地址> -P <端口号> -u <用户名> -p来登录上数据库服务,由于该服务就是运行在当前主机上且使用的是默认配置的端口,所以不需要带-h和-P选项也可以进行登录。
如果需要连接到运行在其他主机上的MySQL数据库服务,或者MySQL服务不是运行在默认端口上,那么就需要使用-h和-P选项来指定主机名和端口号。
0.1 登录选项
-h 或 --host:用于指定MySQL服务所在的主机IP地址或主机名。如果MySQL服务运行在本地机器上,并且希望通过命令行连接到它,那么这个选项通常是可选的,因为默认就是连接到本地主机(localhost)。但是,如果需要连接到网络上的另一台机器上的MySQL服务,就必须使用-h选项来指定那台机器的地址。
-P 或 --port:用于指定MySQL服务监听的端口号。MySQL的默认端口号是3306,但是如果更改了MySQL的配置,让它监听一个不同的端口,那么在连接时就需要使用-P选项来指定这个端口号。
-u 或 --user:用于指定登录MySQL服务器的用户名。这个选项是必须的,因为MySQL需要知道要以哪个用户的身份进行连接。
-p 或 --password:这个选项稍微有些特殊。如果直接在-p选项后面跟上密码(不推荐这样做,因为这样做会在命令行历史中留下密码),那么MySQL客户端会尝试使用这个密码进行连接。但是,更常见的做法是不在-p后面直接跟密码,而是单独使用-p选项。这样,MySQL客户端会在连接时提示输入密码。出于安全考虑,推荐使用后一种方式
1. 什么是数据库
1.1 MySQL数据库的基本认识
数据库本质是一个网络服务:
root@VM-16-3-ubuntu:~# which mysql
/usr/bin/mysql
root@VM-16-3-ubuntu:~# which mysqld
/usr/sbin/mysqld
其中mysql是数据库的客户端,而mysqld是数据库的服务器端,所以和其它C/S模式的网络服务没什么区别
mysqld是一个后台服务器程序,并且是守护进程,系统启动时自动启动数据库服务,所以不需要手动启动,mysql是用来与mysqld进行交互获取服务的
查看该进程相关的网络信息:
mysql服务是一套给用户提供数据存取服务的一个网络程序 ,也就是数据库管理系统
这里需要区分一个概念,就是我们日常所说的数据库和这里的mysql服务,数据库主要是指那些长期保存在磁盘上的数据文件的的集合,这些文件中数据是按照一定的数据模型进行组织、描述和存储,具有较小的冗余、较高的数据独立性和易扩展性,并可为各种用户共享;而mysql是运行在服务器上的一个程序,它是对数据进行组织和管理的一种具体的实现方式而已,它组织和管理数据的方式是这样的:
MySQL是一个关系型数据库,对数据的组织和管理都是通过创建和维护一张张二维表来实现的,每张表代表了数据库中的一个实体或概念,行代表记录(或实体实例),列代表字段(或属性)。这种二维表结构使得关系型数据库能够高效地存储、查询、更新和删除数据
这是逻辑结构而不是具体的物理结构
1.1.1 数据库和文件
既然是存储数据,那直接用文件不就行了吗,还要数据库干什么?
因为文件只提供了基本的存储数据的功能,并没有很好地(给用户)提供对数据的管理功能,举个例子,假如说文件中有一万行IP地址,然后需要统计一下以120开头的地址,这时程序员就只能手写代码读取文件内容判断并统计,对程序员来说就很麻烦,如果在增加一个要求把120开头的换成130,就更麻烦了,所以使用文件来存储数据的话,会导致用户对数据的增删查改都不方便,这时就必须要用到数据库
数据库系统给用户提供了对数据库文件中的数据进行高效增删查改的功能,用户给系统相关字段或者要求,然后系统直接给用户返回结果,而不再需要用户自己写代码来实现了
宏观上理解这数据库客户端+服务器端+磁盘上的数据库文件这一整套也叫做数据库
也可能存在内存级的数据库文件
1.1.3 数据库路径
配置文件内容通常存储在这个路径下:
root@VM-16-3-ubuntu:~# ls /etc/mysql/
conf.d debian.cnf debian-start my.cnf my.cnf.fallback mysql.cnf mysql.conf.d
/etc
目录中主要保存的是系统和其它程序启动和运行的配置文件
数据库文件内容通常存储在该路径下:
root@VM-16-3-ubuntu:~# ls /var/lib/mysql
auto.cnf binlog.000004 ca.pem '#ib_16384_0.dblwr' ibtmp1 mysql.ibd server-cert.pem undo_002
binlog.000001 binlog.000005 client-cert.pem '#ib_16384_1.dblwr' '#innodb_redo' performance_schema server-key.pem VM-16-3-ubuntu.pid
binlog.000002 binlog.index client-key.pem ib_buffer_pool '#innodb_temp' private_key.pem sys
binlog.000003 ca-key.pem debian-5.7.flag ibdata1 mysql public_key.pem undo_001
/var
路径中主要保存的是系统在运行时经常发生变化的文件和数据
2. 基本库的操作
显示已有数据库:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
建立一个hello_world数据库:
不难看出,创建一个数据库本质就是在linux系统中新建一个目录
选择hello_world数据库并建立一张学生表:
# 选择use
mysql> use hello_world
Database changed
# 建表
mysql> create table student(
-> name varchar(32),
-> age int,
-> sex varchar(2)
-> );
Query OK, 0 rows affected (0.08 sec)
此时查看数据库目录下的内容也就是表:
mysql> show tables;
+-----------------------+
| Tables_in_hello_world |
+-----------------------+
| student |
+-----------------------+
1 row in set (0.00 sec)
或者在系目录中查看:
root@VM-16-3-ubuntu:/var/lib/mysql/hello_world# ls
student.ibd
可以发现多了一个文件,所以建表本质是在linux系统中创建一个文件
往该表中插入一行数据:
mysql> insert into student (name, age,sex) values ('lzh', 21, '男');
按列依次插入相应数据即可
以上所有操作都是由mysqld服务器做的
到这里不难看出,其实数据库就是一组文件,只不过这些这些文件是由数据库服务器直接进行操作的,而不是由程序员,程序员是通过相关数据库操作指令间接操作这些文件
3. 服务器、数据库和表的关系
数据库服务器端可以同时管理大量的数据库,一般而言开发者会针对每个应用程序创建一个数据库,然后在库中创建一张张表来保存用户在使用该程序期间所产生的大量相关数据,它们的关系图如下:
4. MySQL架构
4.1 连接层(Connection Layer)
连接层是MySQL架构的顶层,负责处理客户端与服务器之间的连接请求。其主要组件包括:
连接管理器:负责管理客户端与服务器之间的连接,包括连接的建立、维护和关闭
认证模块:负责对客户端进行身份验证,验证客户端提供的用户名和密码是否正确
安全套接字层(SSL):提供加密通信和安全认证功能,用于保护连接的安全性
线程池:用于管理处理客户端请求的线程或进程,以提高系统的并发处理能力
4.2 服务层(Service Layer)
服务层是MySQL架构的中间层,负责解析和执行客户端发送的SQL查询请求。其主要组件包括:
SQL解析器:负责将客户端发送的SQL查询解析为内部的查询语法树,以便进行后续的优化和执行
查询优化器:负责对查询进行优化,包括选择合适的索引、优化查询执行顺序等,以提高查询的执行效率
查询缓存(已废弃):在旧版本的MySQL中,查询缓存用于缓存查询结果以加速相同查询的执行。然而,在高并发环境下,查询缓存可能会成为性能瓶颈,因此在新版MySQL中已经被废弃
执行器:根据优化器提供的执行计划来操作数据,并返回结果给客户端。在此过程中,执行器会调用存储引擎的API来执行数据操作,并验证用户是否具有权限执行该SQL语句
4.3 存储引擎层(Storage Engine Layer)
存储引擎层是MySQL架构的底层,负责实际的存储和管理数据。MySQL支持多种存储引擎,每种存储引擎都有自己的特点和适用场景。常见的存储引擎包括InnoDB、MyISAM、Memory等
InnoDB:MySQL的默认存储引擎,支持事务、行级锁、外键等高级特性,适用于大部分OLTP(联机事务处理)应用
MyISAM:不支持事务和行级锁,但具有较高的性能和较小的存储空间开销,适用于读密集型应用
Memory:将所有数据存储在RAM中,提供了非常快速的读写速度,但数据不是持久化的,适用于临时数据存储和缓存
具体来说,存储引擎是数据库管理系统如何存储数据、如何给存储的数据建立索引以及和如何更新、查询数据等这些技术的具体实现方法
MySQL的核心就是插件式存储引擎,支持多种存储引擎,换句话说它支持存储引擎的热插拔,这意味着用户可以根据不同的应用场景和需求,在MySQL服务器运行时动态地加载和卸载相应的存储引擎,这种架构使得MySQL具有良好的可扩展性、灵活性和性能
4.3.1 查看存储引擎
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MyISAM | YES | MyISAM storage engine | NO | NO | NO |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| CSV | YES | CSV storage engine | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.13 sec)
4.4 文件系统层
文件系统层包含了具体的日志文件和数据文件以及MySQL相关的程序。它负责数据的物理存储和读取,是存储引擎层与硬件之间的桥梁
5. SQL语句分类
SQL语句主要可以分为以下几类:
-
数据查询语言(DQL, Data Query Language)
数据查询语言主要用于查询数据库中的数据。DQL的基本结构由SELECT子句、FROM子句和(可选的)WHERE子句组成。代表关键字为SELECT。例如,查询某个表中的特定字段或记录。 -
数据操纵语言(DML, Data Manipulation Language)
数据操纵语言用于添加、删除、更新数据库中的数据。DML主要包括三种形式:
插入(INSERT):用于向表中插入新的记录。
更新(UPDATE):用于修改表中的现有记录。
删除(DELETE):用于从表中删除记录。 -
数据定义语言(DDL, Data Definition Language)
数据定义语言用于定义和修改数据库中对象的结构,如表、视图、索引等。DDL的主要操作包括创建(CREATE)、删除(DROP)、修改(ALTER)等。例如,使用CREATE TABLE语句创建一个新表,使用DROP TABLE语句删除一个表,使用ALTER TABLE语句修改表结构。 -
事务控制语言(TCL, Transaction Control Language)
事务控制语言用于管理数据库事务,确保数据的一致性和完整性。TCL的主要操作包括提交(COMMIT)、回滚(ROLLBACK)和保存点(SAVEPOINT)等。提交操作用于将事务中的更改永久保存到数据库中,回滚操作则用于撤销事务中的更改,而保存点则允许在事务中设置临时的回滚点。 -
数据控制语言(DCL, Data Control Language)
数据控制语言用于控制对数据库及其对象的访问权限和安全级别。DCL的主要操作包括授权(GRANT)和回收权限(REVOKE)等。通过这些操作,数据库管理员可以授予或撤销用户对数据库对象的访问权限,从而确保数据库的安全性
SQL语句并不特指MySQL数据库中的语句,而是结构化查询语言(Structured Query Language)的简称,是一种用于存取数据以及查询、更新和管理关系数据库系统的标准编程语言。SQL是一种数据库查询和程序设计语言,用于与数据库通信并执行各种操作