MyISAM InnoDB区别
1.前者不支持事务,后者支持事务
2.前者支持表级锁,后者支持行级锁
3.前者存储表的总行数,后者不存储
4.前者采用非聚集索引,B+树的叶子结点存储数据文件的地址,后者,叶子结点存储数据
MyISAM 适用于频繁查询,大量的select ,InnoDB可靠性安全性比较高,适合表更新的频繁,大量的insert update;
事务
innoDB存储引擎 会提供一组用来记录事务的文件
每一条DML操作 都会记录到这个文件 中,我们可以 提交这个事务,或者回滚事务
提交事务commit 清空这个文件,将数据全部持久化到数据表中。将所有的DML操作提交 命令:commit;
回滚事务rollback,这个文件的所有操作撤销并清空,回滚只能回滚到上一次的提交点,mysql是默认自动提交的,关闭自动提交 是开启事务,start transaction
四个特性
a原子性: 事务是最小的工作单元,所有操作要么全部成功,要么全部失败回,不可在分割。
c一致性:数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。
i隔离性:事务A和事务B具有一定隔离。四个隔离级别
d持久性:事务最终结束的一个屏障,把没有加载到硬盘上的数据保存到硬盘上
事务的隔离级别
从低到高
未提交读:事务中发生了修改,即使没有提交,其他事务也是可见的,比如对于一个数A原来50修改为100,但是我还没有提交修改,另一个事务看到这个修改,而这个时候原事务发生了回滚,这时候A还是50,但是另一个事务看到的A是100.可能会导致脏读
提交读:对于一个事务从开始直到提交之前,所做的任何修改是其他事务不可见的,举例就是对于一个数A原来是50,然后提交修改成100,这个时候另一个事务在A提交修改之前,读取的A是50,刚读取完,A就被修改成100,这个时候另一个事务再进行读取发现A就突然变成100了;可以阻止脏读,但是幻读或不可重复读仍有可能发生
重复读:就是对一个记录读取多次的记录是相同的,比如对于一个数A读取的话一直是A,前后两次读取的A是一致的;可以阻止脏读和不可重复读,但幻读仍有可能发生
幻读,只要事务不结束,读到的数据还是原先那样
串行化,事务排队,不能并发,你操作的时候我不能操作,不会发生脏读和幻读;该级别可以防止脏读、不可重复读以及幻读
索引
索引失效:
- 模糊查找 %开头的
- or 两边有一侧是没有添加索引的
- 使用复合索引时,没有用左侧的列查找,索引失效
- 索引参加了位运算和使用函数 也会失效
索引分类:
单一索引:一个字段上加索引
复合索引:多个字段上加索引
主键索引:主键上加索引
唯一索引:具有unique约束的字段添加索引
视图
创建视图:
create view dept2_view as select * from dept
视图是一张虚拟的表,通常是一张表或多张表的一个子集,修改视图,表中所对应的部分也同时修改;
简单来说,就是将频繁使用但长度长且复杂的sql语句, 以视图的方式创建,需要修改的时候,直接对视图对象进行操作即可,大大提升开发效率
数据库三范式
第一范式:首先有主键,所有的字段不可再分
第二范式:
非主键字段,要完全依赖主键,不能部分依赖(下图的复合索引)
三张表来表示多对多的关系
第三范式
在第二范式的基础上,非主键字段直接依赖主键,不能产生传递依赖,非主键字段不能相互依赖
一对多的关系
两张表