← 返回笔记

学习笔记

MySQL 进阶:视图、索引与事务

2026-08-18 09:00 MySQL事务索引视图

梳理视图封装查询、索引优化访问路径与事务保证一致性的 MySQL 进阶知识点。

MySQL 进阶:视图、索引与事务

来源:数据库技术与应用 第三次实验 · 整理:婉萤

视图:包装好的查询

视图是存储在数据库里的命名查询,本质是一层「虚拟表」:

CREATE VIEW v_emp_dept AS
SELECT e.ename, d.dname FROM emp e JOIN dept d ON e.deptno = d.deptno;
  • 作用:简化复杂查询、隔离敏感列(只暴露需要的字段)、逻辑层不变(底层表结构改了,改视图即可)
  • 注意:视图不存数据,查询视图 = 实时执行底层 SQL

索引:查询加速器

ename 上建索引前后,WHERE ename = '...' 的执行计划从 type=ALL(全表扫描)变成 type=ref(索引查找):

ALTER TABLE emp ADD INDEX idx_ename (ename);
EXPLAIN SELECT * FROM emp WHERE ename = 'SCOTT';
  • 索引适合高频查询、低修改的列
  • 不是越多越好:每次写入都要维护索引
  • 复合索引注意最左前缀原则

事务:要么全做,要么不做

转账场景:A 扣钱、B 加钱,两步必须同生共死。

START TRANSACTION;
UPDATE account SET balance = balance - 100 WHERE id = 1;
UPDATE account SET balance = balance + 100 WHERE id = 2;
COMMIT;  -- 或 ROLLBACK

ACID 四特性里,实务中最常打交道的是 A(原子性)和 I(隔离性)。

存储引擎

  • InnoDB:支持事务、行级锁、外键——现代默认选择
  • MyISAM:不支持事务,表级锁,读多写少的旧场景

配套实践:JDBC 里用 conn.setAutoCommit(false) + commit()/rollback() 手动控制事务——银行账户系统的转账原子性就是这么做的。