mysql是什么数据库_mysql基本概念详解

9次阅读

mysql的“数据库”对应磁盘上的一个文件夹(如/var/lib/mysql/myapp_db/),每张表至少包含.frm(结构)和.ibd(数据+索引)两个文件;删库即删整个文件夹,不可逆。

mysql是什么数据库_mysql基本概念详解

MySQL 是一个开源的关系型数据库管理系统(RDBMS),不是“数据库”本身,而是管理数据库的软件(即 DBMS);你日常说的“创建一个 MySQL 数据库”,实际是让 MySQL 这个 DBMS 创建了一个逻辑上的数据容器(文件夹),里面存着若干张二维表(.frm + .ibd 文件)。

下面直击实操中真正卡人的几个点:

MySQL 里的“数据库”到底对应什么物理文件?

很多人连不上库、备份失败或迁移出错,根源在于误以为“数据库 = 一个文件”。其实:

  • MySQL 中每个数据库在磁盘上就是一个**文件夹**(如 /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,但别再手动加这两个约束,冗余且易冲突

客户端连不上 MySQL?先盯住这三件事

不是密码错,大概率是服务、网络或权限配置没对齐:

  • 确认 MySQL 服务真在跑:net start mysql80windows)或 sudo systemctl status mysqllinux
  • 本地连接用 localhost127.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'@'localhost',最后 FLUSH PRIVILEGES

SQL 语句执行慢?先看是不是在扫全表

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%' 可以 —— 模糊匹配别滥用前导通配符
  • 小表(PRIMARY KEY

真正容易被忽略的是:MySQL 的“数据库”概念既轻量(就是一个文件夹),又敏感(删库即丢所有表文件);而它的 SQL 表现和底层存储(B+树、页分裂、缓冲池)之间隔着一层抽象 —— 你以为在操作逻辑表,其实每条 SELECT 都在跟磁盘页和内存缓存打交道。动手前,先想清楚你要的到底是「快速验证」还是「生产就绪」。

text=ZqhQzanResources