数据库基础概念
什么是数据库?
数据库是结构化信息的集合,支持高效的数据存储、检索和管理。常见的类型包括:
- 关系型数据库(如MySQL、PostgreSQL)
- 非关系型数据库(如MongoDB、Redis)
关系型 vs 非关系型
特性 | 关系型数据库 | 非关系型数据库 |
---|---|---|
数据结构 | 表(行和列) | 灵活(文档、键值等) |
扩展方式 | 垂直扩展 | 水平扩展 |
适用场景 | 复杂查询、事务支持 | 大数据、灵活模式 |
SQL基础
创建表
/*
* 创建用户信息表
* 功能:存储系统用户的核心信息
* 设计规范:
* - 主键使用自增ID确保唯一性
* - 关键字段添加约束保证数据完整性
*/
CREATE TABLE users (
-- 用户唯一标识(主键)
-- 类型:INT(4字节整型)
-- 约束:PRIMARY KEY(主键索引),AUTO_INCREMENT(自动+1)
id INT PRIMARY KEY AUTO_INCREMENT,
-- 用户姓名(必填字段)
-- 类型:VARCHAR(50)(最大50个字符的变长字符串)
-- 约束:NOT NULL(禁止空值)
name VARCHAR(50) NOT NULL,
-- 用户邮箱(唯一标识)
-- 类型:VARCHAR(100)(最大100个字符)
-- 约束:UNIQUE(唯一索引,禁止重复)
email VARCHAR(100) UNIQUE,
-- 记录创建时间(自动填充)
-- 类型:TIMESTAMP(精确到秒的时间戳)
-- 默认值:CURRENT_TIMESTAMP(系统当前时间)
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
插入数据
INSERT INTO users (name, email)
VALUES ('Alice', 'alice@example.com');
查询数据
SELECT name, email FROM users WHERE id = 1;
数据库设计
规范化(Normalization)
- 目标:减少数据冗余,避免更新异常。
- 常用范式:
- 1NF:列不可再分。
- 2NF:消除部分依赖。
- 3NF:消除传递依赖。
索引的作用
- 加速查询,但会增加写操作的开销。
- 示例:
CREATE INDEX idx_name ON users (name);
性能优化
慢查询优化步骤
- 使用
EXPLAIN
分析执行计划。 - 确保查询使用了索引。
- 避免
SELECT *
,只取需要的字段。 - 优化JOIN操作,减少临时表大小。
示例:EXPLAIN输出解读
EXPLAIN SELECT * FROM users WHERE name = 'Alice';
- 关键列:
type
(扫描类型)、rows
(预估扫描行数)、key
(使用的索引)。
事务管理
ACID属性
- Atomicity(原子性):事务全部成功或全部失败。
- Consistency(一致性):事务前后数据库状态合法。
- Isolation(隔离性):并发事务互不干扰。
- Durability(持久性):事务提交后数据永久保存。
隔离级别
级别 | 脏读 | 不可重复读 | 幻读 |
---|---|---|---|
READ UNCOMMITTED | ✔️ | ✔️ | ✔️ |
READ COMMITTED | ✖️ | ✔️ | ✔️ |
REPEATABLE READ | ✖️ | ✖️ | ✔️ |
SERIALIZABLE | ✖️ | ✖️ | ✖️ |
常见问题与解决方案
错误:Deadlock found
- 原因:多个事务互相等待资源。
- 解决:
- 重试事务。
- 调整事务顺序,缩短持有锁的时间。
SQL注入防护
-
永远不要拼接SQL字符串!
-
使用参数化查询:
# Python示例 cursor.execute("SELECT * FROM users WHERE id = %s", (user_id,))