graph TD A[数据库锁] --> B[按锁模式] A --> C[按锁粒度] A --> D[按持有时间] B --> B1[共享锁 S] B --> B2[排他锁 X] B --> B3[更新锁 U] B --> B4[意向锁 IS/IX] C --> C1[行级锁] C --> C2[页级锁] C --> C3[表级锁] C --> C4[数据库锁] D --> D1[立即释放] D --> D2[事务结束释放]
2. 锁模式详解
(1) 共享锁(S锁)
特征:允许多个事务并发读取
兼容性:与S锁兼容,与X锁冲突
SQL示例:
1
SELECT*FROM products WITH (HOLDLOCK) WHERE category='Electronics';
(2) 排他锁(X锁)
特征:独占资源,禁止其他任何锁
获取场景:INSERT/UPDATE/DELETE
死锁风险:高并发下易导致死锁
(3) 更新锁(U锁)
作用:防止更新操作的死锁
升级机制:读取时U锁,更新时升级为X锁
兼容性:与S锁兼容,与其他U/X锁冲突
(4) 意向锁(IS/IX)
目的:快速检测表级锁冲突
工作流程:
加行锁前先加表级意向锁
其他事务通过意向锁判断冲突
避免逐行检查锁状态
3. 锁粒度对比
粒度
并发性
系统开销
适用场景
行级锁
高
高
OLTP系统
页级锁
中
中
混合负载
表级锁
低
低
批量操作
数据库锁
最低
最低
备份恢复
4. 死锁处理机制
1 2 3 4 5 6 7 8 9 10 11 12 13
sequenceDiagram participant T1 as 事务1 participant T2 as 事务2 participant DB as 数据库引擎 T1->>DB: 锁定资源A (X锁) T2->>DB: 锁定资源B (X锁) T1->>DB: 请求资源B (等待) T2->>DB: 请求资源A (等待) DB->>DB: 死锁检测(每5秒) DB->>T2: 终止事务(牺牲者) T2-->>DB: 回滚并释放锁 T1->>DB: 获取资源B
死锁避免策略:
按固定顺序访问资源
使用SET LOCK_TIMEOUT 1000(超时释放)
降低事务隔离级别(如READ COMMITTED)
二、索引核心技术详解
1. 索引结构演进
1 2 3 4 5 6
graph LR A[线性索引] --> B[树形索引] B --> C[B树] C --> D[B+树] D --> E[LSM树] E --> F[自适应索引]
SELECT employee_id, department, salary, AVG(salary) OVER(PARTITIONBY department) AS dept_avg, RANK() OVER(PARTITIONBY department ORDERBY salary DESC) AS salary_rank FROM employees;
(2) 递归查询(CTE)
1 2 3 4 5 6 7 8 9 10
WITHRECURSIVE OrgTree AS ( SELECT id, name, manager_id FROM employees WHERE id =101-- CEO UNIONALL SELECT e.id, e.name, e.manager_id FROM employees e INNERJOIN OrgTree o ON o.id = e.manager_id ) SELECT*FROM OrgTree;
3. 事务控制精要
1 2 3 4 5 6 7 8 9 10 11 12 13
BEGIN TRANSACTION;
UPDATE accounts SET balance = balance -100WHERE id =1; UPDATE accounts SET balance = balance +100WHERE id =2;
-- 模拟错误 DECLARE@errorINT=0; IF @@ERROR<>0SET@error=1;
IF @error=0 COMMIT TRANSACTION; ELSE ROLLBACK TRANSACTION;
-- 单条插入(低效) INSERT INTO users (name) VALUES ('Alice'); INSERT INTO users (name) VALUES ('Bob');
-- 批量插入(高效) INSERT INTO users (name) VALUES ('Alice'), ('Bob'), ('Charlie');
四、数据库系统对比
主流数据库特性对比
特性
MySQL
PostgreSQL
SQL Server
Oracle
存储引擎
InnoDB, MyISAM
单一存储引擎
单一引擎
单一引擎
索引类型
B+树, 全文
B+树, GIN, GiST
B+树, 列存储
B+树, 位图
并发控制
MVCC
MVCC
行版本控制
MVCC
JSON支持
5.7+
优秀
2016+
12c+
地理空间
基础
PostGIS扩展
基础
Spatial扩展
开源协议
GPL
PostgreSQL许可
商业
商业
五、实战优化案例
电商系统查询优化
原始查询:
1 2 3 4 5 6
SELECT*FROM orders o JOIN customers c ON o.customer_id = c.id WHERE o.status ='SHIPPED' AND o.order_date BETWEEN'2023-01-01'AND'2023-06-30' ORDERBY o.order_date DESC LIMIT 100;
优化步骤:
创建覆盖索引:
1 2 3
CREATE INDEX idx_orders_status_date ON orders(status, order_date DESC) INCLUDE (customer_id, total_amount);
改写查询避免SELECT *:
1 2 3 4 5 6 7
SELECT o.id, o.order_date, o.total_amount, c.name FROM orders o JOIN customers c ON o.customer_id = c.id WHERE o.status ='SHIPPED' AND o.order_date BETWEEN'2023-01-01'AND'2023-06-30' ORDERBY o.order_date DESC LIMIT 100;
执行计划验证: +—-+————-+——-+————+——-+————————-+ | id | select_type | table | partitions | type | key | +—-+————-+——-+————+——-+————————-+ | 1 | SIMPLE | o | NULL | range | idx_orders_status_date | | 1 | SIMPLE | c | NULL | eq_ref| PRIMARY | +—-+————-+——-+————+——-+————————-+