目录
什么是数据库
存储数据用文件就可以了,为什么还要弄个数据库? 因为文件保存数据有以下几个缺点:
- 文件的安全性问题
- 文件不利于数据的增删改查:一般文件确实提供了数据的存储和基本的读写功能,但对文件内容做增删改查,如果没有数据库,程序员要自己写代码做增删改查,不方便,有时候甚至不可能完成,而有了数据库,只需要告诉它需求,它自动完成
- 文件不利于存储海量数据
- 文件在程序中控制不方便
为了解决上述问题,专家们设计出更加利于管理数据的东西——数据库,它能更有效的管理数据。数据库的水平是衡量一个程序员水平的重要指标。数据库一般指的是:在磁盘或内存中存储的特定结构组织的数据。
[root@VM-16-12-centos mysql]# which mysql
/usr/bin/mysql
[root@VM-16-12-centos mysql]# which mysqld
/usr/sbin/mysqld
上面的 mysql 是 mysql 的客户端,mysqld 是 mysql 的服务端。mysql 的本质是一种基于 C(mysql) S (mysqld) 模式的一种网络服务。
[root@VM-16-12-centos mysql]# netstat -nltp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp6 0 0 :::3306 :::* LISTEN 22085/mysqld

主流数据库
- SQL Sever: 微软的产品,.Net程序员的最爱,中大型项目。
- Oracle: 甲骨文产品,适合大型项目,复杂的业务逻辑,并发一般来说不如MySQL。
- MySQL:世界上最受欢迎的数据库,属于甲骨文,并发性好,不适合做复杂的业务。主要用在电商,SNS,论坛。对简单的SQL处理效果好。
- PostgreSQL :加州大学伯克利分校计算机系开发的关系型数据库,不管是私用,商用,还是学术研究使用,可以免费使用,修改和分发。
- SQLite: 是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。
- H2: 是一个用Java开发的嵌入式数据库,它本身只是一个类库,可以直接嵌入到应用项目中。
基本使用
连接和退出
mysql -h 127.0.0.1 -P 3306 -u root -p
参数解释:
| 参数 | 含义 | 在本命令中的值 |
|---|---|---|
-h | 指明 host(主机地址) | 127.0.0.1 —— 本机回环地址,即连接本地的 MySQL 服务 |
-P | 指明 port(端口号,大写 P) | 3306 —— MySQL 默认监听端口 |
-u | 指明 user(用户名) | root —— MySQL 的超级管理员账户 |
-p | password(密码,小写 p) | 后不跟具体密码,执行后会提示你交互式输入(更安全,避免密码暴露在命令行历史中),-p 后直接跟密码(如 -p123456)也是允许的,但不安全,因为密码会明文留在命令历史中。 |
注意:
-h 和 -P 如果省略,默认就是 127.0.0.1 和 3306,所以本命令等效于简写:
mysql -u root -p
链接成功后,在 mysql 的命令行输入 quit 即可退出
[root@VM-16-12-centos mysql]# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.44 MySQL Community Server (GPL)
Copyright (c) 2000, 2023, 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.
mysql> quit
Bye
创建数据库
链接数据库后,输入:(注意 mysql 指令要用 ; 作为结尾)
show databases;
结果:
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.00 sec)
退出 mysql 使用 vim 查看 /etc/my.cnf:
[mysqld]
#
# Remove leading # and set to the amount of RAM for the most important data
# cache in MySQL. Start at 70% of total RAM for dedicated server, else 10%.
# innodb_buffer_pool_size = 128M
#
# Remove leading # to turn on a very important data integrity option: logging
# changes to the binary log between backups.
# log_bin
#
# Remove leading # to set options mainly useful for reporting servers.
# The server defaults are faster for transactions and fast SELECTs.
# Adjust sizes as needed, experiment to find the optimal values.
# join_buffer_size = 128M
# sort_buffer_size = 2M
# read_rnd_buffer_size = 2M
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
skip-grant-tables
character-set-server=utf8
default-storage-engine=innodb
这就是 mysql 的配置文件,其中:datadir=/var/lib/mysql 就是数据库的存储目录,我们查看这个目录下的文件:
[root@VM-16-12-centos mysql]# ls /var/lib/mysql
auto.cnf client-cert.pem ibdata1 ibtmp1 mysql.sock.lock public_key.pem sys
ca-key.pem client-key.pem ib_logfile0 mysql performance_schema server-cert.pem
ca.pem ib_buffer_pool ib_logfile1 mysql.sock private_key.pem server-key.pem
我们发现 mysql 现在的数据库其实就是 /var/lib/mysql 的子目录。
我们再链接上 mysql ,输入:
create database helloworld;
mysql> create database helloworld;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| helloworld |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.00 sec)
再退出 mysql 查看 /var/lib/mysql:
[root@VM-16-12-centos mysql]# ls /var/lib/mysql
auto.cnf client-cert.pem ib_buffer_pool ib_logfile1 mysql.sock private_key.pem server-key.pem
ca-key.pem client-key.pem ibdata1 ibtmp1 mysql.sock.lock public_key.pem sys
ca.pem helloworld ib_logfile0 mysql performance_schema server-cert.pem
发现多了 helloworld 这一目录,说明创建数据库的本质就是创建 Linux 文件目录,我们查看helloworld 这一目录:
[root@VM-16-12-centos mysql]# ls /var/lib/mysql/helloworld
db.opt
使用数据库
链接上 mysql 后,上面输入 show databases; 后,展示了 information_schema、mysql、performance_schema、sys,和我们自己创建的 helloworld 等等数据库,输入:
use helloworld;
可以对开始特定的数据库进行操作。
创建数据库表
上面选择 helloworld 这个数据库后,输入:
create table student(
id int,
name varchar(32),
gender varchar(2)
);
查看 /var/lib/mysql/helloworld:
[root@VM-16-12-centos mysql]# ls /var/lib/mysql/helloworld
db.opt student.frm student.ibd
与上面相比,多了 student.frm student.ibd 这两个文件,说明创建数据库表本质就是创建 Linux 目录下的文件
表中插入数据
在 mysql 命令行输入:
insert into student (id, name, gender) values (1, '张三', '男');
insert into student (id, name, gender) values (2, '李四', '女');
insert into student (id, name, gender) values (3, '王五', '男');
查询表中的数据
select * from student;
mysql的架构
逻辑架构(四层结构)
MySQL 采用客户端/服务器模式,从你输入命令到返回结果,经历了下面这几层:

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
存储引擎
存储引擎是:数据库管理系统如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。MySQL的核心就是插件式存储引擎,支持多种存储引擎。
查看存储引擎
show engines \G
mysql> show engines \G
*************************** 1. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 2. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
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: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 7. row ***************************
Engine: ARCHIVE
Support: YES
Comment: Archive storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 8. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
*************************** 9. row ***************************
Engine: FEDERATED
Support: NO
Comment: Federated MySQL storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL
9 rows in set (0.00 sec)
InnoDB(默认引擎,MySQL 5.5+)
绝对的主流,99%的业务场景都用它。
| 特性 | 说明 |
|---|---|
| 事务 | 完整支持 ACID,有 COMMIT、ROLLBACK、崩溃恢复 |
| 锁粒度 | 行级锁(Row-Level Lock),高并发下性能好 |
| 外键 | 支持外键约束,保证数据一致性 |
| 索引 | 使用 B+ 树,数据和索引存储在一起(聚簇索引) |
| MVCC | 多版本并发控制,实现非阻塞读,提高并发性能 |
| 物理文件 | .ibd 文件(数据和索引)、ib_logfile(重做日志) |
适用场景:几乎一切事务型业务——电商订单、用户账户、支付系统、内容管理系统。
MyISAM(MySQL 5.5 之前的默认引擎)
老牌引擎,现在已边缘化,但仍有很多历史遗留系统在用。
| 特性 | 说明 |
|---|---|
| 事务 | ❌ 不支持 |
| 锁粒度 | 表级锁(Table-Level Lock),写操作会锁整张表 |
| 外键 | ❌ 不支持 |
| 索引 | 使用 B+ 树,但数据和索引分开存储(非聚簇索引) |
| 压缩 | 支持表压缩,可大幅节省空间 |
| 物理文件 | .frm(表结构)、.MYD(数据)、.MYI(索引) |
优点:读操作极快,占用空间小。
缺点:写操作锁表,并发差;崩溃后难以恢复。
适用场景:纯只读报表、数据仓库、日志分析(几乎不写入的场景)。
Memory(内存引擎)
数据全部存在内存中,重启即丢失。
| 特性 | 说明 |
|---|---|
| 存储位置 | 内存(RAM),读写极快 |
| 持久化 | ❌ 不持久,服务重启数据全丢 |
| 锁粒度 | 表级锁 |
| 索引 | 默认使用 Hash 索引(也支持 B 树) |
| 适用数据量 | 小数据量(受 max_heap_table_size 限制) |
适用场景:临时表、缓存表、会话数据、高频查询的字典表(如省市区编码)。
Archive(归档引擎)
| 特性 | 说明 |
|---|---|
| 压缩比 | 极高,以 zlib 压缩存储 |
| 操作 | 只支持 INSERT 和 SELECT,不支持 UPDATE/DELETE |
| 索引 | 只支持自增主键索引 |
| 锁粒度 | 行级锁 |
适用场景:日志归档、审计记录、历史数据冷存储。
其他引擎(了解即可)
| 引擎 | 特点 | 场景 |
|---|---|---|
| CSV | 数据存为 CSV 文件 | 与 Excel/外部系统交换数据 |
| Blackhole | 写入的数据直接丢弃(黑洞) | 用于主从复制中的中继,或性能测试 |
| Federated | 访问远程 MySQL 表,不存本地数据 | 数据联邦查询(现较少用) |
对比总结(面试重点)
| 对比维度 | InnoDB | MyISAM | Memory |
|---|---|---|---|
| 事务 | ✅ | ❌ | ❌ |
| 行级锁 | ✅ | ❌(表锁) | ❌(表锁) |
| 外键 | ✅ | ❌ | ❌ |
| 崩溃恢复 | ✅(通过 Redo Log) | ❌ | ❌ |
| MVCC | ✅ | ❌ | ❌ |
| 数据与索引存储 | 聚簇(在一起) | 非聚簇(分开) | 非聚簇 |
| 全文索引 | ✅(5.6+支持) | ✅ | ❌ |
| 空间占用 | 较大 | 较小 | 极小(内存) |
| 适用场景 | 事务型OLTP | 只读报表 | 临时缓存 |
1505

被折叠的 条评论
为什么被折叠?



