MySQL的“数据库”对应磁盘上的一个文件夹(如/var/lib/mysql/myapp_db/),每张表至少包含.frm(结构)和.ibd(数据+索引)两个文件;删库即删整个文件夹,不可逆。
MySQL 是一个开源的关系型数据库管理系统(RDBMS),不是“数据库”本身,而是管理数据库的软件(即 DBMS);你日常说的“创建一个 MySQL 数据库”,实际是让 MySQL 这个 DBMS 创建了一个逻辑上的数据容器(文件夹),里面存着若干张二维表(.frm + .ibd 文件)。
下面直击实操中真正卡人的几个点:
很多人连不上库、备份失败或迁移出错,根源在于误以为“数据库 = 一个文件”。其实:
/var/lib/mysql/myapp_db/)users.frm(表结构)、users.ibd(数据+索引).frm 文件定义列名、类型、主键等;.ibd 文件用 B+ 树组织数据,叶子节点存完整行记录DROP DATABASE myapp_db)= 直接删掉整个文件夹 —— 不可逆,没回收站CREATE TABLE 会失败?常见约束陷阱建表看似简单,但字段定义稍有偏差,后续写入或 JOIN 就报错。关键注意:
NOT NULL 字段没给默认值,且 INSERT 时又漏填 → 报错 Field 'xxx' doesn't have a default value
VARCHAR(255) 存手机号?浪费空间;用 INT 存带前导零的编号(如 '00123')→ 零被吃掉 → 改用 CHAR(5) 或字符串类型FOREIGN KEY)必须满足:① 引用列有索引;② 类型严格一致(INT 不能对 BIGINT);③ 引用表引擎必须是 InnoDB(MyISAM 不支持)NOT NULL + UNIQUE,但别再手动加这两个约束,冗余且易冲突不是密码错,大概率是服务、网络或权限配置没对齐:
net start mysql80(Windows)或 sudo systemctl status mysql(Linux)localhost 和 127.0.0.1 行为不同:localhost 走 socket 文件(/tmp/mysql.sock),127.0.0.1 走 TCP —— 若 socket 路径不对,localhost 直接拒绝CREATE USER 'dev'@'localhost' 不够,还得 GRANT SELECT,INSERT ON myapp_db.* TO 'dev'@'lo
calhost',最后 FLUSH PRIVILEGES
90% 的慢查不是 SQL 写得差,而是缺索引或索引没用上:
EXPLAIN SELECT * FROM orders WHERE user_id = 123; 看 type 列:如果是 ALL,说明正在全表扫描WHERE status = 'paid' AND created_at > '2025-01-01')要建联合索引,顺序很重要:高频过滤字段放前面(status 比时间更离散,应放左)LIKE '%abc' 无法用索引;LIKE 'abc%' 可以 —— 模糊匹配别滥用前导通配符真正容易被忽略的是:MySQL 的“数据库”概念既轻量(就是一个文件夹),又敏感(删库即丢所有表文件);而它的 SQL 表现和底层存储(B+树、页分裂、缓冲池)之间隔着一层抽象 —— 你以为在操作逻辑表,其实每条 SELECT 都在跟磁盘页和内存缓存打交道。动手前,先想清楚你要的到底是「快速验证」还是「生产就绪」。