MySQL 数据库 2(Day50)
主题:MySQL 多实例部署、库(Database)详细操作、存储引擎(InnoDB/MyISAM/Memory/Blackhole)、常用数据类型(整数/浮点/日期/字符串/ENUM/SET)、约束条件(UNSIGNED/NOT NULL/DEFAULT/UNIQUE/PRIMARY KEY/AUTO_INCREMENT)
结构总览
MySQL 数据库 2
├─ MySQL 多实例部署
│ ├─ 原理:一台物理机多个 mysqld 进程,端口/数据目录/配置三者独立
│ ├─ 部署步骤:数据目录 → 独立配置文件 → 初始化 → 启动 → 验证
│ ├─ 适用场景:资源隔离 / 测试环境 / 节省成本
│ └─ 常见排错:端口冲突、socket 冲突、权限、datadir 非空
├─ 库详细操作
│ ├─ CREATE / SHOW / ALTER / DROP DATABASE
│ ├─ USE 切换、SELECT DATABASE() 查看当前库
│ └─ utf8mb4 字符集 + COLLATE 排序规则
├─ 存储引擎(翻译层)
│ ├─ SHOW ENGINES / default_storage_engine / ENGINE= 建表指定
│ ├─ InnoDB / MyISAM / Memory / Blackhole 功能对比
│ └─ 各引擎文件结构对比(.frm/.ibd/.MYD/.MYI)
├─ 数据类型
│ ├─ 整数:TINYINT / SMALLINT / MEDIUMINT / INT / BIGINT(字节数与范围)
│ ├─ 浮点与定点:FLOAT / DOUBLE / DECIMAL(金额用 DECIMAL)
│ ├─ 日期时间:DATE / TIME / DATETIME / TIMESTAMP(2038 问题)
│ ├─ 字符串:CHAR(定长)vs VARCHAR(变长)
│ └─ 枚举与集合:ENUM 单选、SET 多选
└─ 约束条件
├─ UNSIGNED / NOT NULL / DEFAULT / UNIQUE
├─ PRIMARY KEY(唯一 + 非空 + 加速查询)与复合主键
└─ AUTO_INCREMENT(自增,通常配合主键)
关键要点
多实例部署: 用同一个 mysqld 命令启动多个 MySQL 进程,每个进程监听不同端口(3306/3307/3308),拥有独立数据目录与配置文件,彼此隔离——相当于一台机器上运行多台”虚拟” MySQL 服务器。核心原则:端口、socket、数据目录三者必须独立。部署五步:① mkdir -p /data/3306 /data/3307 /data/3308 + chown -R mysql:mysql;② 每实例独立配置文件(如 /etc/my3306.cnf,含 port/datadir/socket/pid-file/log-error);③ mysqld --initialize --user=mysql --datadir=/data/3306 分别初始化;④ mysqld_safe --defaults-file=/etc/my3306.cnf & 启动;⑤ netstat -tlnp | grep 330 验证,用 mysql -uroot -p -S /tmp/mysql3306.sock 按 socket 连接。适用场景:资源隔离(不同业务互不影响)、测试环境(单机模拟多台)、节省成本。排错:端口冲突 → netstat -tlnp 查占用;socket 路径冲突 → 每实例独立 socket;启动失败 → datadir 权限(chown -R mysql:mysql);初始化失败 → datadir 非空(清空后重新初始化)。
库操作: 库(Database)对应文件系统的目录。语法:CREATE DATABASE db1; / CREATE DATABASE db1 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;(建库时建议指定 utf8mb4 以支持完整 Unicode 含 emoji);查看 SHOW DATABASES;(所有库)、SHOW CREATE DATABASE db1;(建库语句);切换 USE db1;、查看当前库 SELECT DATABASE();;修改 ALTER DATABASE db1 CHARACTER SET utf8mb4;;删除 DROP DATABASE db1;(⚠️ 危险操作,删除所有数据)。
存储引擎: 是 MySQL 管理软件与本地文件之间的”翻译层”,决定数据如何存储、索引如何建立、是否支持事务。查看:SHOW ENGINES;、SHOW VARIABLES LIKE 'default_storage_engine';(InnoDB 为默认)、建表指定 CREATE TABLE t1 (id INT) ENGINE=InnoDB;。
四大引擎文件对比:
| 引擎 | 文件 | 说明 |
|---|---|---|
| MyISAM | .frm + .MYD + .MYI | 表结构 + 数据 + 索引三者分离 |
| InnoDB | .frm + .ibd | 表结构 + 数据+索引合并存储 |
| Memory | .frm | 仅表结构,数据存内存 |
| Blackhole | .frm | 仅表结构,数据不存储 |
四大引擎功能对比: InnoDB(默认)支持事务/行级锁/外键/崩溃恢复 → 生产环境首选;MyISAM 不支持事务(表锁)→ 读多写少场景;Memory 数据在内存(重启丢失)→ 临时表/缓存;Blackhole 数据写入即丢弃 → 日志/丢弃数据(用于复制的”黑洞”)。
数据类型 — 整数: TINYINT 1 字节(-128127)、SMALLINT 2 字节、MEDIUMINT 3 字节、INT 4 字节(-21474836482147483647)、BIGINT 8 字节。
数据类型 — 浮点与定点: FLOAT 精度低(科学计算)、DOUBLE 精度中(一般数值)、DECIMAL 精度最高(金额/财务数据推荐)。FLOAT(255,30) / DOUBLE(255,30) / DECIMAL(65,30) 可指定长度与小数位,同值插入精度差异明显。
数据类型 — 日期时间: DATE(仅日期 YYYY-MM-DD)、TIME(仅时间 HH:MM:SS,范围 -838:59:59838:59:59)、DATETIME(日期+时间 YYYY-MM-DD HH:MM:SS,最常用)、TIMESTAMP(带时区,范围 1970-01-012038-01-19,受 2038 年问题影响)。
数据类型 — 字符串: CHAR 定长(不足补空格,固定占用,查询效率高;适合手机号/身份证等固定长度);VARCHAR 变长(长度前缀 + 实际数据,节省空间;适合姓名/地址等不定长)。超长插入会报错或截断。
数据类型 — 枚举与集合: ENUM 单选(从预定义列表选一个,如 gender ENUM('male','female'));SET 多选(逗号分隔,如 hobbies SET('music','read','movie') → 'music,read'),插入值必须在定义列表中。
约束条件: UNSIGNED(只存非负数,负数报错);NOT NULL(非空);DEFAULT(未指定时用默认值,如 id INT UNSIGNED NOT NULL DEFAULT 10);UNIQUE(值不能重复);PRIMARY KEY(主键 = NOT NULL + UNIQUE + 加速查询,B+树索引使主键查询最快);AUTO_INCREMENT(自动递增,通常配合主键,插入时省略该列自动生成 1,2,3…)。复合主键:PRIMARY KEY (id, name) 多个字段共同组成主键。查询速度对比:WHERE id = 2(走主键索引,快)vs WHERE name = 'tom'(无索引,慢)。
相关页面
- MySQL 概念页 — 本课核心概念页(多实例部署/库操作/存储引擎/数据类型/约束)
- MySQL 数据库 1(Day49) — 上一实操课(密码/配置/SQL/安装)
- 数据库导学(Day48) — MySQL 学习周期全景路线图
- PHP 体系架构 — LNMP 部署中的 MySQL 角色(Day38)
- Nginx 概念页 — LNMP 架构中的反向代理层