从 “什么是 MySQL“ 到库与表的完整操作(MySQL基础篇)

作者:bksczm日期:2026/9/10

在学 MySQL 时,我们常说:

mysql 是客户端,mysqld 是服务端;

创建数据库后,/var/lib/mysql 下就多了一个文件夹;

备份就是用 mysqldump 把 SQL 语句保存下来,还原就是 source 执行一遍;

存储引擎决定了数据怎么存、怎么索引、怎么锁。

这些话背后藏着几个值得深究的问题:

  • MySQL 的 C/S 架构到底是怎么工作的?
  • 存储引擎(InnoDB / MyISAM)到底解决什么问题,为什么说它是 "发动机"?
  • DCL 和事务(commit)到底是不是一回事?
  • show processlist 里为什么有两条记录,其中一条是 mysqld 吗?

我们从第一个问题入手。

一、什么是 MySQL

1.1 本质:一个基于 C/S 模式的网络服务

MySQL 本质上是一个网络服务:mysql 是客户端,mysqld 是服务端(守护进程)。换句话说,这是一个基于 C/S(Client/Server)模式的软件。

  • mysql:客户端程序(CLI 命令行工具),用户敲命令的地方;
  • mysqld:服务端守护进程,真正干活的地方 —— 接收指令、分析语法、执行操作、返回结果。

客户端和服务端可以不在同一台机器(通过 -h 指定 IP 连接),也可以在同一台机器 —— 单机开发时,你的主机上同时运行着两个进程:一个 mysql 客户端进程、一个 mysqld 服务端进程。准确说法是 "这台机器同时是客户端和服务端"。

默认通过 TCP/IP 的 3306 端口通信;本地登录时也可走 Unix socket 文件(/var/run/mysqld/mysqld.sock),速度更快。

1.2 mysqld 提供什么服务

mysqld 提供的是数据库服务(Database Management System,DBMS 服务)。

1.3 什么是数据库服务

我们知道,所有的数据在硬盘中的存储方式都是二进制的。换句话说,以往所有的目录 / 普通文件,都只是将信息存储在对应的 data block 中 ——没有对数据进行加工存储!

而我们往后存储数据,不再是简单地存储到外存中,而是将数据通过数据库加工存储的形式存储到外存中。

所谓 "加工",就是数据库额外做的事:

1- 结构化:建库、建表,按"行 × 列"组织数据
2- 约束与类型:每列有明确的数据类型和约束,保证数据合法性
3- 索引:加速查找
4- 事务:保证数据的一致性和可靠性(ACID)
5- 并发控制:多用户同时读写不出错
6- 备份与恢复
7

一句话:文件系统只负责 "把字节存下来",数据库负责 "把数据组织得又快又可靠"。

1.4 登录操作

1mysql -h IP -P 端口 -u 用户 -p
2
选项含义说明
-h要连接的 MySQL 服务器 IPhost,默认本机
-P要连接的 MySQL 客户端端口号默认 3306
-u要登录 MySQL 的哪一个用户如 root
-p登录密码见下方注意

注意:-P 和 -p 的意义不同—— 大写 P 是端口(Port),小写 p 是密码(password)。

两个实操细节:

  1. -p 与密码之间不能有空格:mysql -u root -p123456 合法,mysql -u root -p 123456 会被解析成 "密码为空、123456 是要连接的库名";
  2. 生产环境不建议把密码直接写在命令行:会暴露在 shell 历史和 ps 输出里。更安全的做法是只写 -p,回车后交互输入密码。

二、常见的数据库服务软件

软件厂商 / 来源特点适用场景
SQL Server微软.Net 程序员的最爱,Windows 平台为主中大型项目
Oracle甲骨文功能全面、稳定性与并发能力都很强,适合超大规模和复杂业务逻辑;短板是商业授权贵、运维复杂大型项目、复杂业务
MySQL甲骨文(Oracle 收购 Sun 后归其所有)世界上最受欢迎的数据库,并发性好(InnoDB 行锁 + MVCC),简单 SQL 处理效果好,但不适合过于复杂的业务电商、SNS、论坛
PostgreSQL加州大学伯克利分校计算机系开发开源关系型数据库,免费使用、修改和分发(私用 / 商用 / 学术均可),功能强大,复杂查询能力强复杂查询、数据分析、地理信息等
SQLite开源轻量级嵌入式数据库,遵守 ACID,包含在相对小的 C 库中,占用资源极低,嵌入式设备可能只要几百 K 内存嵌入式产品、移动端
H2开源(Java)用 Java 开发的嵌入式数据库,本身只是一个类库,可直接嵌入应用项目Java 应用内嵌数据库

"Oracle 并发一般来说不如 MySQL" 表述不准确 ——Oracle 在超大规模并发与复杂事务处理上并不弱于 MySQL,甚至更强。两者真正拉开差距的是成本与运维复杂度,而不是并发能力。

三、客户端与服务端的交互模型

相当于 client 端向 server 端发送命令,server 端接收到指令之后进行分析,接着通过对应的指令(前提是正确)执行客户想要执行的操作。

1客户端 mysql ──发送 SQL──> 服务端 mysqld
2                              │ 词法/语法分析 → 优化 → 执行
3客户端 <──返回结果集──────────┘
4

这里要说明的是:单机部署时,我们的主机同时运行着客户端进程和服务端进程,所以 "server 能够直接对我们的主机进行操作"—— 本质是 mysqld 以操作系统用户身份读写 /var/lib/mysql 下的数据文件。

四、数据库服务的类型:SQL 分类

SQL 按功能分为以下几类:

类别全称作用代表指令
DDLData Definition Language 数据定义语言维护存储数据的结构create、drop、alter(还有 truncate)
DMLData Manipulation Language 数据操纵语言对数据进行操作insert、delete、update
DQLData Query Language 数据查询语言查询数据(可视为 DML 中单独分出来的一类)select
DCLData Control Language 数据控制语言权限管理grant、revoke
TCLTransaction Control Language 事务控制语言事务管理(补充)commit、rollback、savepoint、start transaction

五、存储引擎(重点:讲清楚)

5.1 到底什么是存储引擎

既然 MySQL 是数据库软件,为什么还要有 "存储引擎" 这层东西?

关键在于分层:MySQL 的架构分两层 ——

1┌─────────────────────────────────────────────┐
2│  SQL 层(MySQL 服务器本身)                    │
3│  负责:语法解析、权限校验、优化、连接管理……      │
4│  这一层对外的表现就是"SQL 接口"                 │
5├─────────────────────────────────────────────┤
6│  存储引擎层(可插拔)                          │
7│  负责:数据到底怎么存、怎么建索引、              │
8│        怎么加锁、怎么更新查询、怎么保证事务       │
9└─────────────────────────────────────────────┘
10

存储引擎 = 数据库管理系统 "如何存储数据、如何为存储的数据建立索引、如何更新和查询数据" 这些底层技术的具体实现。

打个比方:MySQL 服务器是车,存储引擎是发动机。车身、方向盘、仪表盘(SQL 层)都一样,但换上不同的发动机(引擎),加速、油耗、稳定性、能不能越野(事务、行锁、外键)完全不同。所以 MySQL 说自己是 "可插拔存储引擎" 架构 —— 同一套 SQL 语法,底层实现可以自由切换。

查看当前 MySQL 支持哪些引擎:

1show engines;
2

5.2 常用的 InnoDB 和 MyISAM

对比项InnoDB(默认)MyISAM(老引擎)
事务(ACID)✅ 支持❌ 不支持
锁粒度行级锁(并发好)表级锁(并发差)
外键✅ 支持❌ 不支持
索引结构聚簇索引(数据与索引在一起)非聚簇索引
崩溃恢复✅ 支持(redo log)❌ 较弱
磁盘文件.ibd(表数据 + 索引).MYD(数据)+ .MYI(索引)
适用场景绝大多数业务:电商、社交、金融历史遗留库、只读查询密集场景

结论:现代 MySQL 默认就是 InnoDB,绝大多数业务直接用默认即可;MyISAM 因不支持事务、表级锁并发差,已逐渐被取代(但老系统里常见,认识它主要用于排查历史库)。

5.3 如何指定引擎

建表时显式指定:

1create table t (id int) engine=InnoDB;
2

已有表也可以改引擎:

1alter table t engine=InnoDB;
2

六、数据库(database)的操作

6.1 创建数据库

1create database (if not exists) xxx;
2
  • MySQL 中以 ; 作为命令行结束符;
  • if not exists:如果库已存在则不报错(否则会报错);
  • 例如:
1create database if not exists bksw;
2

6.2 查看有哪些数据库

1show databases;
2

执行后就能看到对应的 bksw 数据库。

6.3 数据库文件存储在哪里

可是我们讲过,MySQL 只是提供管理数据的功能,但数据库(管理 + 数据)仍然需要存储在外存中 ——Linux 文件系统那篇笔记(从磁盘物理结构到 inode、dentry 与挂载)仍然是需要学习的。

Ubuntu 默认存储在 /var/lib/mysql 中。这里和之前 process 那部分类似:创建了一个 database,就会出现一个文件夹。之前的进程、设备走的是 "一切皆文件" 的思想,通过文件系统和挂载将文件与内核联系起来;而 MySQL 是更简单的存储 ——一个数据库 = 该目录下的一个文件夹,文件夹里放着这个库的表数据文件(InnoDB 是 .ibd 文件等;MySQL 8.0 中表结构定义统一存进数据字典,不再有单独的 .frm)。

6.4 如何使用这个数据库

1use xxx;
2

例如 use bksw;—— 可以理解成 cd bksw,表示 "后续操作都进入 bksw 这个库"。

6.5 自定义数据库字符集和校验规则

字符集(charset):数据存入对应数据库时采用的编码标准,解决 "用什么字节表示字符" 的问题(如 utf8mb4 支持 emoji、四字节字符)。

校验规则(collation):数据比较与排序时采用的规则 —— 解决 "怎么比大小、怎么排序" 的问题,典型差异是大小写是否敏感:

1utf8mb4_general_ci  → ci = case insensitive,大小写不敏感
2utf8mb4_bin         → 按二进制比较,大小写敏感
3

(原笔记 "校验规则是数据从数据库取出采用的标准" 不够准确 —— 取出的字节就是存进去的字节,collation 影响的是比较 / 排序,比如 WHERE 和 ORDER BY 的行为。)

所以字符集和校验规则要选互相兼容的! 每个字符集都有一组配套的校验规则(collation),不能乱配。

查看命令:

1show charset;                                          -- 查看支持的字符集
2show collation;                                        -- 查看支持的校验规则
3show variables like 'character_set_database';          -- 当前库默认字符集
4show variables like 'collation_database';              -- 当前库默认校验规则
5

创建数据库时可以显式指定字符集和校验规则:

1create database if not exists xxx charset=想要的字符集 collate=想要的校验规则;
2

6.6 查看创建 database 执行指令

1show create database xxx;    -- 表格方式显示
2show create database xxx \G; -- 垂直/命令行方式显示
3

示例输出:

1+----------+---------------------------------------------------------------------+
2| Database | Create Database                                                    |
3+----------+---------------------------------------------------------------------+
4| bksw     | CREATE DATABASE `bksw` /*!40100 DEFAULT CHARACTER SET utf8mb3 */   |
5|          | /*!80016 DEFAULT ENCRYPTION='N' */                                  |
6+----------+---------------------------------------------------------------------+
7

这里解释两个看着奇怪的注释:

  1. 版本条件注释 /*!40100 ... */:这是 MySQL 的扩展注释,格式是 /*!版本号 内容 */。意思是当 MySQL 版本 >= 4.01 时才执行其中的内容,低版本会忽略。所以 /*!40100 DEFAULT CHARACTER SET utf8mb3 */ 表示 "高版本执行:默认字符集 utf8mb3";
  2. utf8mb3 是 utf8 的旧名(MySQL 8.0 起明确区分),示例里这个库是老版本创建的;MySQL 8.0 新库默认字符集是 utf8mb4(更推荐)。

6.7 修改数据库

主要修改字符集和校验规则:

1alter database xxx charset=xxx collate=xxx;
2

为什么不建议修改数据库的名字? 因为上层应用已经引用了这个库,轻易修改会造成严重后果;而且 ALTER DATABASE 本身就没有提供修改库名的功能。所以数据库名字要在创建前想好,要改名只能导出再导入。

6.8 删除数据库

1drop database (if exists) xxx;
2

执行这个操作之后,/var/lib/mysql 下对应的文件夹会被删除,换句话说数据会全部消失。因此删除之前应该尽量备份数据。

6.9 备份数据库

在 shell 中输入指令:

1mysqldump -P 端口 -u 用户 -p -B 库名 > 保存路径
2
选项含义
-P端口号
-u用户
-p输入密码
-B备份整个数据库(会包含 CREATE DATABASE 和 USE 语句)

接着登入 MySQL:

1source 保存路径;
2

就能够直接还原了。

那所谓的备份到底进行了怎么样的操作? 而这个备份就是将我们执行过的正确指令保存起来。还原的时候,就是执行保存的指令(mysqldump 是逻辑备份,导出的是一堆 CREATE / INSERT SQL 语句)。还原也可以用另一种方式:mysql -u root -p < 备份文件。

如果想要同时保存多个数据库:

1mysqldump -P 端口 -u 用户 -p -B 库1 库2 ... > 保存路径;
2

如果只想要备份某个数据库中的某几张表(修订原文错误):

1mysqldump -P 端口 -u 用户 -p 库名 表1 表2 ... > 保存路径;
2

注意:备份指定表时不能带 -B!-B(--databases)后面的所有参数都会被当作 "数据库名" 处理,把表名混在 -B 后面会报错。不带 -B 时,第一个参数是库名,后面的参数才是表名。

6.10 查看数据库的连接情况(排查非法入侵)

1show processlist;
2
1+-----+-----------------+-----------+---------+---------+---------+------------------------+------------------+
2| Id  | User            | Host      | db      | Command | Time    | State                  | Info             |
3+-----+-----------------+-----------+---------+---------+---------+------------------------+------------------+
4|   5 | event_scheduler | localhost | NULL    | Daemon  | 1194881 | Waiting on empty queue | NULL             |
5| 959 | root            | localhost | test9_8 | Query   |       0 | init                   | show processlist |
6+-----+-----------------+-----------+---------+---------+---------+------------------------+------------------+
7

为什么有两行?难道有一行表示 mysqld?—— 不是。

这两行都是 mysqld 进程内部的线程,含义完全不同:

行身份解释
第一行event_schedulermysqld 的内部后台线程(事件调度器),Command 是 Daemon,一直处于 "等待空队列" 状态,负责调度定时事件,不是外部连接,也不是 "mysqld 本体"
第二行root@localhost你自己—— 你执行 show processlist 的这个会话,Command 是 Query,Info 里就是正在执行的 show processlist

所以:一行是系统后台线程,一行是你的客户端会话线程。如果排查非法入侵,重点看 User / Host 列有没有陌生来源、Command 是不是异常的 Query / Sleep。

想看完整的正在执行的 SQL,用:

1show full processlist;
2

七、表(table)的操作

7.1 什么是表(讲清楚)

数据库是用于管理数据的一种结构体,但数据的特征多种多样,因此数据库实际上管理的是表—— 实际存储数据的是表(table)。

类比(呼应 Linux 文件系统笔记):

1数据库 database  ≈  文件夹(命名空间,用于归类)
2表     table    ≈  文件夹里的普通文件(真正装数据的地方)
3行     row      ≈  文件里的一条记录
4列     column   ≈  记录里的一个字段/属性(有类型和约束)
5

数据库 = 表的集合;表 = 二维结构(行 + 列)。 一张表落盘后就是 /var/lib/mysql/ 库名 / 下的数据文件(InnoDB 是 .ibd)。

注意:想要创建表,需要先 use 进入一个数据库!

7.2 创建表

1CREATE TABLE 表名 (
2    field1 datatype,
3    field2 datatype,
4    field3 datatype
5) character set 字符集 collate 校验规则 engine 存储引擎;
6
  • 字符集和校验规则默认直接继承数据库的,显式说明则使用显式说明的;
  • engine 默认是 InnoDB,你可以显式指定;
  • 常见类型示例:int(整数)、varchar (n)(变长字符串)、char (n)(定长字符串)、text、date、datetime 等。

7.3 查看表的结构

1desc 表名;
2

直接查看指定表的结构(属性的名称 + 属性的类型 + 约束)。

7.4 修改表

操作语法说明
增加一个属性alter table 表名 add 列名 类型;添加新列
修改某一个属性的类型alter table 表名 modify 列名 新类型;只改类型 / 约束
删除某一个属性alter table 表名 drop 列名;删列
修改表的名字alter table 旧名 rename to 新名;改表名
修改表属性的名字alter table employee change 旧列名 新列名 varchar(60);新字段需要完整定义(新列名 + 类型 + 约束)

7.5 删除表

1drop table if exists 表名;
2

7.6 为属性添加注释(相当于代码中的注释)

在设置类型的时候加 comment '说明字段':

1create table employee (
2    name varchar(60) comment '员工姓名'
3);
4

这里要说:MySQL 中单引号和双引号默认不进行区分,都可以表示字符串(只有在开启 ANSI_QUOTES 模式时,双引号才会被当作标识符而非字符串)。

7.7 查看创建表进行的操作

1show create table 表名;
2

7.8 向表中插入元素

1insert into 表名 (插入的属性) values (插入的值);
2

例如:

1insert into employee (name) values ('张三');
2

八、总结

  1. MySQL 的本质:基于 C/S 模式的网络服务 ——mysql 是客户端、mysqld 是服务端;提供数据库服务,数据经数据库 "加工"(结构化、索引、事务、并发控制)后存到外存。
  2. 登录:mysql -h IP -P 端口 -u 用户 -p,-P(大写)是端口、-p(小写)是密码,二者意义不同;-p 与密码之间不能有空格,生产环境不要明文带密码。
  3. SQL 分类:DDL(结构)/ DML(数据)/ DQL(查询)/ DCL(权限 grant、revoke)/ TCL(事务 commit、rollback)——commit 属于 TCL,不属于 DCL。
  4. 存储引擎 = "怎么存、怎么建索引、怎么锁" 的底层实现,是 MySQL 的可插拔 "发动机";InnoDB(默认,事务 + 行锁 + 外键 + 崩溃恢复)vs MyISAM(表锁、无事务,已过时)。
  5. 库操作:create /show databases /use/show create /alter/drop;落盘在 /var/lib/mysql,一个库一个文件夹;字符集管 "怎么存",校验规则管 "怎么比较排序",必须兼容搭配。
  6. 备份与还原:mysqldump(逻辑备份 = 导出 SQL 语句)+ source 还原;备份指定表时不能带 -B。
  7. show processlist 的两行:一行是 mysqld 内部后台线程(event_scheduler),一行是你自己的会话 —— 都不是 "mysqld 本体"。
  8. 表操作:create(可指定字符集 / 校验规则 / 引擎)/desc/alter(add、modify、drop、rename、change)/drop/comment /show create /insert;数据库 ≈ 文件夹,表 ≈ 文件夹里的文件,行是记录、列是字段.

《从 “什么是 MySQL“ 到库与表的完整操作(MySQL基础篇)》 是转载文章,点击查看原文。


相关推荐


【框架篇】Spring MVC 介绍及使用(详细教程)
2601_962065492026/9/2

Spring MVC 介绍-------------### 1,MVC 设计模式MVC(Model-View-Controller)是一种常见的软件设计模式,用于将应用程序的逻辑分离成三个独立的组件:1. 模型(Model):模型是应用程序的数据和业务逻辑的表示。它负责处理数据的读取、存储和操作,以及业务规则的处理。模型通常是独立于用户界面的,可以在不同的视图和控制器之间共享和重用。2. 视图(View):视图是用户界面的呈现部分,负责展示数据给用户,并接收用户的输入。视图通常是根据模型的数


Linux第一课:Linux的基本命令和底层结构的理解
虚无的纽扣2026/8/25

引言         今天我们也是正式进入到Linux的学习,想必大家对Linux这个名字都不陌生,Linux是一套开源、免费、多用户和多任务的类Unix操作系统内核,也是所有程序员必学的系统,今天我们就先来了解一下Linux的一些基本命令和原理。接下来的讲解我用的是Ubuntu系统。 一、目录         目录是Linux系统的核心骨架,整个系统所有资源,全部挂载在目录树下,目录就相当于是windows系统的文件夹,所以要打好Linux的基础,我们第一步要做的就是先了解Linux目录


Python 常用函数总结
GrowthDiary0072026/8/12

(1)如果不知道这个包有什么方法可以使用 dir() 打印出来 from collections import deque print(dir(deque)) (2)常用方法总结 分类工具/函数核心功能重要注意事项原生内置dict()d.update(obj)、d.keys()、d.values()、d.items()set()s.add(x)、s.update(iterable)/s.remove(x)enumerate(iter, start=0)同时返回下标与元素for i, val


一个队列,怎么让滑动窗口从 O(nk) 变 O(n)?单调队列彻底搞懂
烬羽2026/8/3

滑动窗口最大值的 O(n) 解法:为什么"比你年轻还比你强"就该被踢出? // 给你一个数组和一个窗口大小 k,窗口从左滑到右,每滑一步输出窗口内最大值 // 输入: nums = [1, 3, -1, -3, 5, 3, 6, 7], k = 3 // 期望: [3, 3, 5, 5, 6, 7] // 如果你第一次见到这题,大概率会这样写: var maxSlidingWindow = function(nums, k) { const result = []; for


Agent & AI 名词大扫盲
我是一筐橙子2026/7/26

Agent & AI 名词大扫盲:一篇文章搞懂 10 个核心概念 你是不是经常在 AI 圈听到一堆名词——大模型、Agent、RAG、MCP、Function Call……每个都似懂非懂?这篇文章用最通俗的语言,一口气帮你扫清 10 个高频 AI 术语。 1. 什么是大模型? 一句话:大模型就是「读过全网、能对答如流」的超级大脑。 大模型(Large Language Model,LLM)是指参数规模巨大的神经网络模型,通过在海量文本数据上训练而来。它学到的不是「死记硬背」,而是语言的模式


MVI模式的完整历史、误解和现代Android范式
稀有猿诉2026/7/18

本文译自「Yes, That’s MVI: The Pattern’s Full History, Misconceptions, and Modern Android Form」,原文链接proandroiddev.com/yes-that-is…,由Eury Pérez Beltré发布于2025年5月29日。 每项传统背后都有其原因——而原因背后,又蕴藏着一个故事。 – 佚名 欢迎阅读本文!我的目标是帮助你真正理解 MVI 模式的本质,解释我为何对我的观点充满信心,以及该模式的起源


别再手动拼接路径了!Node.js path 模块的 9 个核心 API 详解
先吃饱再说2026/7/10

别再手动拼接路径了!Node.js path 模块的 9 个核心 API 详解 摘要:路径处理是每个 Node.js 项目都绕不开的活。本文从 path.join 和 path.resolve 的区别入手,逐一拆解 path 模块的 9 个核心 API,并结合代码演示跨平台路径处理的正确姿势。读完你会发现——原来我之前一直在用错误的方式拼接路径。 📑 目录 为什么需要 path 模块? path.join 与 path.resolve:最容易被搞混的两个 API path.dirname


用 Vibe Coding 搭了一个完整小程序「一定能成」
有趣的老凌2026/7/2

前言 这不是一篇技术教程,而是一个产品创作者的完整记录——从脑子里一个模糊的想法,到上线一个包含用户端、API、后台管理、AI 集成的真实产品,全程用 Codex 协作完成。 一、引子:一个想法的诞生 我一直有一个困扰。 市面上缺一个让我能把目标「真正执行下去」的工具。 Notion 太自由,需要自己搭建模板,搭完模板就没动力执行了。待办清单太简单,只能记「今天要做什么」,解决不了「今天为什么要做这个」和「明天该做什么」。OKR 太企业级,适合团队管理,不适合个人日常。 我想要的东西其实很简单


图解 MongoDB 08|ESR 原则:复合索引的字段顺序怎么定
十三Tech2026/6/23

复合索引是 MongoDB 性能优化里最常用、也最容易用错的工具。很多人建复合索引的方式是「查询用到哪几个字段,就按想到的顺序建一个」,结果发现索引只用了第一个字段,查询照样慢。问题不在「有没有建索引」,而在字段顺序。 复合索引的字段顺序,决定了它能服务哪些查询、能用上几个字段。同样的三个字段 {a, b, c},排成 {a, b, c} 和 {c, b, a} 是两棵完全不同的 B-tree,能加速的查询也完全不同。这一篇讲清楚复合索引字段排序的核心原则——ESR(Equality, Sort


古法编程秘籍(七):互联网到底是什么?把两台电脑怎么说话搞懂就够了
JustHappy2026/6/15

Hi!这里是 JustHappy 这是专为编程初学者准备的专栏。这次我们来“上网”,但是互联网不是网页,也不只是 HTTP,它本质上是不同机器上的程序按规则交换数据。看懂客户端、服务器、协议、操作系统、网卡这条链,再分清 HTTP 的“一问一答”和 WebSocket 的“持续通信”,你的网络世界观才算真正搭起来。 上一篇我们讲到这里: 代码会执行、会发起 IO、硬件会工作、中断会通知CPU、操作系统会处理。 最后程序收到事件,再继续执行。 写到这里,很多人会自然冒出一个新问题: 如果 IO

首页编辑器站点地图

本站内容在 CC BY-SA 4.0 协议下发布

Copyright © 2026 聚合阅读