主题
数据库速查
概念 + 命令,面向上手。新增存储引擎 / 索引 / 分表分库 / 执行顺序 / EXPLAIN / 慢查询等深度内容。
一、关系型 vs 非关系型
| 关系型(SQL) | 非关系型(NoSQL) | |
|---|---|---|
| 代表 | MySQL / PostgreSQL / Oracle / 达梦 DM | MongoDB / Redis / ES |
| 数据结构 | 表(行+列),严格模式 | 文档 / 键值 / 图 |
| 关联 | 外键 JOIN | 嵌入或应用层关联 |
| 场景 | 业务系统(订单、用户、权限) | 缓存、日志、搜索 |
二、核心概念
| 概念 | 解释 |
|---|---|
| 表(Table) | 行 = 记录,列 = 字段 |
| 主键(PK) | 唯一标识一条记录 |
| 外键(FK) | 关联另一张表主键 |
| 索引(Index) | 加速查询 |
| 事务 | BEGIN → 操作 → COMMIT / ROLLBACK |
事务 ACID
- Atomicity:要么全做,要么全不做
- Consistency:数据从一致状态到另一一致状态
- Isolation:并发事务互不干扰
- Durability:提交后永久保存
隔离级别
| 级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ UNCOMMITTED | Y | Y | Y |
| READ COMMITTED | N | Y | Y |
| REPEATABLE READ(InnoDB 默认) | N | N | 基本避免 |
| SERIALIZABLE | N | N | N |
索引
| 类型 | 说明 |
|---|---|
| 主键索引 | 唯一、非空、聚簇索引(InnoDB 物理排序) |
| 唯一索引 | 值唯一,可为 NULL |
| 普通索引 | 加速查询 |
| 联合索引 | 多列组合,最左前缀原则 |
| 全文索引 | 文本搜索 |
- B+Tree:InnoDB 默认,叶子节点形成有序双向链表,适合范围查询和排序
- 聚簇 vs 二级:聚簇索引(主键)叶子存完整行 → 二级索引查完需回表;覆盖索引可避免回表
分表分库
| 策略 | 说明 |
|---|---|
| 垂直分库 | 按业务拆:用户库 / 订单库 |
| 垂直分表 | 大表拆列:高频列主表 + 详情扩展表 |
| 水平分库 | 按行拆分到不同库(hash / range 路由) |
| 水平分表 | 同库内按行拆成多张结构相同的小表 |
常见问题:跨分片 JOIN / 事务、全局 ID(雪花)、count 和分页复杂化。
SQL 执行顺序
FROM → ON → JOIN → WHERE → GROUP BY → HAVING → SELECT → DISTINCT → ORDER BY → LIMITEXPLAIN 关键字段
| 字段 | 关注 |
|---|---|
type | ALL < index < range < ref < eq_ref < const(越靠后越好) |
key | 实际使用的索引 |
rows | 预估扫描行数 |
Extra | Using index(覆盖索引,好)/ Using filesort / Using temporary(差) |
慢查询
sql
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';
SET GLOBAL slow_query_log = ON;三、MySQL 操作
连接
bash
mysql -u root -p # 本地
mysql -h 192.168.1.100 -u root -p # 远程库/表
sql
SHOW DATABASES;
CREATE DATABASE mydb CHARACTER SET utf8mb4;
USE mydb;
SHOW TABLES;
DESC tablename;建表
sql
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT DEFAULT 0,
created DATETIME DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;索引操作
sql
CREATE INDEX idx_name ON users(name);
CREATE UNIQUE INDEX idx_email ON users(email);
SHOW INDEX FROM users;
DROP INDEX idx_name ON users;CRUD
sql
INSERT INTO users (name, age) VALUES ('张三', 20);
INSERT INTO users (name, age) VALUES ('a', 1), ('b', 2);
UPDATE users SET age = 21 WHERE id = 1;
DELETE FROM users WHERE id = 1;
SELECT id, name FROM users WHERE age >= 18 ORDER BY id DESC LIMIT 10;
SELECT * FROM users WHERE name LIKE '张%';
SELECT * FROM users WHERE id IN (1,2,3);
SELECT * FROM users WHERE age BETWEEN 18 AND 30;
-- JOIN
SELECT u.name, o.amount FROM users u LEFT JOIN orders o ON o.user_id = u.id;
-- 分页优化(深分页用 id 定位)
SELECT * FROM users WHERE id > 10000 ORDER BY id LIMIT 10;事务
sql
START TRANSACTION;
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;
COMMIT; -- 或 ROLLBACK;用户与权限
sql
CREATE USER 'dev'@'%' IDENTIFIED BY 'pass123';
GRANT ALL ON mydb.* TO 'dev'@'%';
SHOW GRANTS FOR 'dev'@'%';
DROP USER 'dev'@'%';备份恢复
bash
mysqldump -u root -p mydb > mydb.sql
mysql -u root -p mydb < mydb.sql连接诊断
sql
SHOW PROCESSLIST;
SHOW STATUS LIKE 'Threads%';四、PostgreSQL 对照
bash
psql -h 127.0.0.1 -U postgres -d dbname
\l | \dt | \d tablename
pg_dump -U postgres -d dbname -f dbname.sql
psql -U postgres -d dbname -f dbname.sql五、国产化数据库(信创)
| 数据库 | 厂商 | 兼容 | 命令要点 |
|---|---|---|---|
| 达梦 DM8 | 武汉达梦 | Oracle 语法 | disql SYSDBA/SYSDBA@127.0.0.1:5236 |
| OceanBase | 蚂蚁 | MySQL 协议 | 连法同 MySQL |
| KingbaseES | 人大金仓 | PostgreSQL | ksql(同 psql) |
| openGauss | 华为 | PostgreSQL | gsql(同 psql) |
达梦常用
bash
# 登录(端口 5236)
disql SYSDBA/SYSDBA@127.0.0.1:5236
# Oracle 风格
SELECT table_name FROM user_tables;
DESC users;
SELECT * FROM users WHERE rownum <= 10;
# 备份恢复
dexp SYSDBA/SYSDBA@127.0.0.1:5236 file=db.dmp full=y
dimp SYSDBA/SYSDBA@127.0.0.1:5236 file=db.dmp full=y六、常见选型
| 需求 | 推荐 |
|---|---|
| 企业级业务 | MySQL / PostgreSQL / 达梦 DM |
| 信创替代 | 达梦 DM / OceanBase / KingbaseES / openGauss |
| 缓存 | Redis |
| 搜索日志 | Elasticsearch |
| 文档存储 | MongoDB |