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'(无索引,慢)。

相关页面