1. 数据库基础
什么是数据库?在安装 mysql 服务器时,mysql 是数据库服务的客户端 ;mysqld 是数据库服务的服务端。
bash
xay@hcss-ecs-3ea8:~/MYSQL$ which mysql
/usr/bin/mysql
xay@hcss-ecs-3ea8:~/MYSQL$ which mysqld
/usr/sbin/mysqld
mysql 本质就是基于C(mysql)S(mysqld)模式的一种网络服务。
既然是个网络服务,也就能够通过 netstat -lntp 指令查看到:
bash
tcp6 0 0 :::3306 :::* LISTEN 1902810/mysqld
tcp6 0 0 ::1:6010 :::* LISTEN 2003832/sshd: root@
tcp6 0 0 :::33060 :::* LISTEN 1902810/mysqld
mysql是一套给用户提供数据存取服务的网络程序。
我们口头上所说的"数据库",一般指的的是,在磁盘/内存中存储的特定结构组织的数据,以及在磁盘上存储的一套数据库方案。而"数据库服务"特指的就是mysqld。
存储数据用文件就可以了,为什么还要弄个数据库?
普通的文件确实提供了数据存储功能,但并没有提供很好的数据内容管理能力(从用户的角度看)。例如:一个文件中存储了 10 万个 IP 地址,我想要统计当前文件中有几个以 198 开头的 IP 地址,以及它们分别是什么------这个数据提取与分析的过程,需要用户自己编程完成,文件本身并不提供这样的管理能力。
文件保存数据有以下几个缺点:
- 文件的安全性问题
- 文件不利于数据查询和管理
- 文件不利于存储海量数据
- 文件在程序中控制不方便
数据库的存储介质: 磁盘和内存。
为了解决上述问题,专家们设计出了更利于管理数据的东西 ------ 数据库 。它能更有效地管理数据。
数据库本质上是对数据内容存储的一套解决方案:用户向数据库提供字段/查询要求,数据库直接返回结果。
2. 数据库的基本使用
连接服务器
指令:mysql -h ip -P port -u 用户名 -p(mysql -h 127.0.0.1 -P 3306 -u root -p)
-h:指明连接的主机,-P:指明主机上的port端口号,-u:指明登录的用户,-p:密码
bash
xay@hcss-ecs-3ea8:~/MYSQL$ mysql -h 127.0.0.1 -P 3306 -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 26
Server version: 8.0.46 MySQL Community Server - GPL
Copyright (c) 2000, 2026, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
输入 quit/exit 退出连接。
可以直接去掉 -h 选项,表示默认连接本地服务器上搭建的mysql服务。去掉 -p 选项,表示使用默认配置的端口号3306。所以一般连接数据库服务器时,一般输入 mysql -u root -p 指令。
先具体的看看什么是数据库。
在命令行输入:show databases; 查看当前系统下创建的数据库:
bash
mysql> show databases;
+---------------------+
| Database |
+---------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+---------------------+
4 rows in set (0.02 sec)
这些数据库在哪?它们存储在 /var/lib/mysql 路径下:
bash
root@hcss-ecs-3ea8:/# cd /var/lib/mysql
root@hcss-ecs-3ea8:/var/lib/mysql# ls
auto.cnf ca.pem ibtmp1 public_key.pem
binlog.000001 client-cert.pem '#innodb_redo' server-cert.pem
binlog.000002 client-key.pem '#innodb_temp' server-key.pem
binlog.000003 debian-5.7.flag mysql sys
binlog.000004 '#ib_16384_0.dblwr' mysql.ibd undo_001
binlog.000005 '#ib_16384_1.dblwr' mysql_upgrade_info undo_002
binlog.index ib_buffer_pool performance_schema
ca-key.pem ibdata1 private_key.pem
创建数据库:create database 库名;
bash
mysql> create database helloworld;
Query OK, 1 row affected (0.01 sec)
创建 helloworld 数据库后,在 /var/lib/mysql 路径下会看到一个名为 helloworld 的目录。
bash
root@hcss-ecs-3ea8:/var/lib/mysql# ls
auto.cnf ca.pem ibdata1 private_key.pem
binlog.000001 client-cert.pem ibtmp1 public_key.pem
binlog.000002 client-key.pem '#innodb_redo' server-cert.pem
binlog.000003 debian-5.7.flag '#innodb_temp' server-key.pem
binlog.000004 helloworld mysql sys
binlog.000005 '#ib_16384_0.dblwr' mysql.ibd undo_001
binlog.index '#ib_16384_1.dblwr' mysql_upgrade_info undo_002
ca-key.pem ib_buffer_pool performance_schema
输入 show databases; 可以查看到它:
cpp
mysql> show databases;
+---------------------+
| Database |
+---------------------+
| helloworld |
| information_schema |
| mysql |
| performance_schema |
| sys |
+---------------------+
5 rows in set (0.01 sec)
总结:建立数据库,本质就是Linux下的一个目录。
3. 数据库表结构
数据库一般都有表结构,要建立表结构,需要选中一个数据库:use 库名
建立数据库表:create table 表名(列名 数据类型,列名 数据类型,......)
bash
mysql> create table student(
-> id int,
-> name varchar(32),
-> gender varchar(2)
-> );
Query OK, 0 rows affected (0.03 sec)
数据库表建立成功后,在 helloworld 数据库中,就可以在该路径下看到 student.ibd 这样的文件:
bash
root@hcss-ecs-3ea8:/var/lib/mysql/helloworld# ls
student.ibd
在数据库内建表,本质就是在Linux下创建对应的文件。
表结构有了,向表结构插入数据:insert into 数据库名 (列名,......) values(插入的值),插入的值必须与在创建表结构时,列名的数据类型所对应,如 id 列是int类型,插入数据时不能是浮点型。
bash
mysql> insert into student (id, name, gender) values('202652', '张三', '男');
Query OK, 1 row affected (0.01 sec)
mysql> insert into student (id, name, gender) values('202653', '李四', '女');
Query OK, 1 row affected (0.00 sec)
mysql> insert into student (id, name, gender) values('202653', '王五', '男');
Query OK, 1 row affected (0.00 sec)
数据插入完毕后,输入 select * from 表名; 查看表结构:
bash
mysql> select * from student;
+--------+--------+--------+
| id | name | gender |
+--------+--------+--------+
| 202652 | 张三 | 男 |
| 202653 | 李四 | 女 |
| 202653 | 王五 | 男 |
+--------+--------+--------+
3 rows in set (0.00 sec)
建立一个数据库,建立一张表结构,插入数据,这些工作都是**mysqld(mysql服务端)**帮助我们完成的,不需要程序员手动操作文件。
4. 服务器,数据库,表之间的关系
安装数据库服务器,只是在机器上安装了一个数据库管理系统程序(mysqld),这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。为保存应用中实体的数据,一般会在数据库中创建多个表,以保存程序中实体的数据。
数据库服务器、数据库和表的关系如下:

上图中的**"Client"指的是mysql客户端** ,"MYSQL"指的是mysqld服务端。
5. MYSQL架构
数据库是行列式结构,以行列式的结构存储数据。
MySQL 是一个可移植的数据库,几乎能在当前所有的操作系统上运行,如 Unix/Linux、Windows、 Mac 和 Solaris。各种系统在底层实现方面各有不同,但是 MySQL 基本上能保证在各个平台上的物理体系结构的一致性。
6. SQL 的分类
DDL【data definition language】:数据定义语言,用来维护存储数据的结构 代表指令: create, drop,alter
DML【data manipulation language】:数据操纵语言,用来对数据进行操作代表指令: insert,delete,update DML中又单独分了一个DQL,数据查询语言,代表指令: select
DCL【Data Control Language】:数据控制语言,主要负责权限管理和事务 代表指令: grant,revoke,commit
7. 存储引擎
存储引擎是:数据库管理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。
MySQL的核心就是插件式存储引擎,支持多种存储引擎。
输入 show engines; 可以查看当前支持的存储引擎:
bash
mysql> show engines \G
*************************** 1. row ***************************
Engine: ndbcluster
Support: NO
Comment: Clustered, fault-tolerant tables
Transactions: NULL
XA: NULL
Savepoints: NULL
*************************** 2. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 4. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: FEDERATED
Support: NO
Comment: Federated MySQL storage engine
Transactions: NO
XA: NULL
Savepoints: NULL
*************************** 7. row ***************************
Engine: ndbinfo
Support: NO
Comment: MySQL Cluster system information storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL
*************************** 8. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 9. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 10. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 11. row ***************************
Engine: ARCHIVE
Support: YES
Comment: Archive storage engine
Transactions: NO
XA: NO
Savepoints: NO
11 rows in set (0.01 sec)
每个存储引擎都有它所对应的功能,大部分情况下,mysql常用的存储引擎就两个:InnoDB和MyISAM,其中80% 使用的是InnoDB。