事务
业务层面上不可分割的最小单位
– DML:insert、delete、update - 对数据库的修改操作才必须要事务
– DQL:select 可以不需要事务
MySQL:事务是自动提交的
– 提交(commit):操作生效
– 回滚(rollback):恢复到操作之前的数据
事务并发问题(重要)
– 脏读:一个事务读取到了另一个事务未提交的数据
– 幻读:一个事务两次读取,数据的数量、个数不同 insert delete
– 不可重复读:一个事务两次读取,数据内容不同 update
事务隔离级别
– 读未提交:read uncommitted(都不能解决)
– 读已提交:read committed(只能解决脏读)(Oracle)
– 可重复读:repeatable read(不能解决幻读)(MySqL)
– 串行化:serializable(都可解决)(隔离级别最高,性能最差,安全性最高)
索引 - index
index - 提高查询效率
– 列:主键约束、unique约束,自动添加索引(唯一索引)
– 唯一索引(unique index)
– 普通索引(index)
区别:有没有唯一约束
– 经常出现在where、distinct、表连接条件的列,可以添加索引
– 数据量很大的表推荐添加索引,数据量小的表不推荐添加索引
– 经常需要DML操作的表,不建议添加索引
– 删除一些不必要的索引
select * from emp where empno = 7369;
-- 创建普通索引
create index index_empno on emp(empno);
-- 创建唯一索引
create unique index index_empno on emp(empno);
-- 创建组合索引
create index index_e on emp(ename, sal);
-- 在where条件后,按索引添加的顺序使用条件,就会自动使用索引
select * from emp where ename like '' and sal < 3000;
--使用强索引查询
select * from emp force index(index_empno) where empno = 1005;
-- 删除索引
alter table emp drop index index_empno;
alter table emp drop index index_e;
视图
临时的表 - 提高查询效率
– 将频繁使用的查询结果,做成视图
– 查询出的结果,本身不在任何基表中,不可以对数据进行修改操作
-- 创建视图
create view dept_avgsal
as
select deptno, avg(sal) avg_sal from emp group by deptno;
-- 删除视图
drop view dept_avgSal;
-- 使用视图进行查询
-- 工资比部门平均工资高的员工信息
select
*
from
emp e
join
dept_avgSal d
on
e.deptno = d.deptno
where
e.sal > d.avg_sal;