mysqld是mysql数据库服务的服务器端进程,负责监听端口、处理客户端连接、解析sql、管理事务及数据存储;mysql仅为客户端工具,用于向mysqld发送请求。

MySQL 是一个开源的关系型数据库管理系统(RDBMS),它不是“数据库”本身,而是管理数据库的软件系统。你创建的 test_db 是数据库,而 mysqld 进程才是 MySQL —— 它负责读写磁盘文件、解析 SQL、校验权限、执行事务等所有核心动作。
MySQL 服务进程 mysqld 是实际干活的主体
启动 MySQL 时真正运行的是 mysqld 这个单进程多线程服务程序,不是 mysql 命令行客户端。后者只是个发请求的工具,类似浏览器之于 Web 服务器。
-
mysqld默认监听3306端口(TCP)或/var/run/mysqld/mysqld.sock(Unix Socket),等待连接 - 每个客户端连接进来后,
mysqld会分配一个线程(或从线程池取一个)专门处理该会话 - 如果看到
Can't connect to local MySQL server through socket,大概率是mysqld没起来,而不是客户端没装好
连接层:第一道门,管“谁可以连”和“怎么连”
这一层不碰数据,只做接入控制。常见问题都出在这里:
- 用
mysql -u root -p报Access denied for user 'root'@'localhost'?说明身份验证模块拒绝了,不是密码错了就是 host 匹配不上(比如用户只允许'root'@'127.0.0.1',但你用localhost连) - 高并发下大量
Too many connections错误?那是连接管理器达到max_connections上限,不是查询慢,是根本没机会进服务层 - SSL/TLS 握手失败?通常因为
require_secure_transport=ON但客户端没配证书,或ssl_mode=DISABLED却硬要加密
服务层:SQL 的翻译官和调度员
所有 SQL 语句到这里才开始被真正“理解”。这里没有存储逻辑,只做通用处理:
-
Parser把SELECT * FROM users WHERE id = 1拆成关键词、表名、条件字段 —— 写错语法(比如漏了FROM)在这里就报错,不往下走 -
Optimizer决定走哪个索引、是否用临时表、要不要排序 ——EXPLAIN看到的type: ALL就是它选了全表扫描,跟引擎无关 - 注意:
Query Cache在 MySQL 8.0 已彻底移除,别在配置里还写query_cache_type=1,它不起作用还占内存
存储引擎层:数据存哪、怎么存、怎么读
这是真正和磁盘/内存打交道的部分,MySQL 支持插件式引擎,但生产环境基本只用 InnoDB:
-
InnoDB支持事务、行锁、MVCC、外键,数据文件是.ibd,日志是ib_logfile0/1 -
MyISAM表级锁、无事务,文件是.MYD+.MYI,现在只用于只读归档或历史遗留系统 - 建表时不显式指定
ENGINE=InnoDB,MySQL 8.0 默认就是它;但如果你从旧版本迁移,可能默认还是MyISAM,得检查show create table t1
真正容易被忽略的是:mysqld 启动时加载的配置(如 my.cnf 中的 default-storage-engine)决定了新表默认用什么引擎,而已有表的引擎不会因此改变。改引擎要用 ALTER TABLE t1 ENGINE=InnoDB,不是改配置就能生效。











