1. 事务简介,事务的特性
- 如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败
2. 事务的四大特征
- 原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。
- 持久性:当事务提交或回滚后,数据库会持久化的保存数据。
- 隔离性:多个事务之间,相互独立。
- 一致性:事务操作前后,数据总量不变。
3. 隔离级别,产生的问题:
- read uncommitted:读未提交
-
产生的问题:脏读,不可重复读,幻读
-
脏读:一个事务,读取到另一个事务中没有提交的数据;
-
不可重复读(虚读):在同一个事务中,两次读取到的数据不一样;
-
幻读:一个事务内读取到了别的事务插入的数据,导致前后读取不一致
- read committed:读已提交(Oracle)
-
产生的问题:不可重复读,幻读
- repeatable read:可重复读(MySQL默认)
-
产生的问题:幻读
- serializable:串行化
4. 三级范式:
- 1nf:每一列都是不可再分的原子列
- 2nf:满足1nf,并且非主属性完全依赖于主属性
- 3nf:满足2nf,并且任何非主属性不依赖其他非主属性
5. 乐观锁与悲观锁及应用场景
乐观锁:认为对于同一个数据的并发操作是不会发生修改的,在更新数据时会采用尝试更新不断重试的方式更新数据
悲观锁:认为对于同一个数据的并发操作,一定是为发生修改的
6. 什么是CAS,缺点
- CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做
- 缺点:ABA问题,循环时间长开销大和只能保证一个共享变量的原子操作
1. ABA问题。因为CAS需要在操作值的时候检查下值有没有发生变化,如果没有发生变化则更新,但是如果一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,但是实际上却变化了。ABA问题的解决思路就是使用版本号。在变量前面追加上版本号,每次变量更新的时候把版本号加一
2. 只能保证一个共享变量的原子操作。当对一个共享变量执行操作时,我们可以使用循环CAS的方式来保证原子操作,但是对多个共享变量操作时,循环CAS就无法保证操作的原子性,这个时候就可以用锁,或者有一个取巧的办法,就是把多个共享变量合并成一个共享变量来操作。
7. 优化查询的方法:
- 库表优化,表设计合理化,符合三大范式;
- 使用索引:尽量避免全表扫描,在orderby,groupby,where涉及的列上使用索引
- 优化sql语句:通过explain查看sql语句的执行效果;不要使用select *;不在索引列做运算或使用函数;尽可能用limit减少返回的行数
8. mysql索引分类,优缺点
- mysql会给主键和唯一约束的字段自动加索引
- 什么时候需要添加索引:数据量庞大、字段经常被用作查询条件、该字段有很少的DML(因为DML之后,索引要重新排序)
- 分类:普通索引,唯一索引,主键索引,空间索引,全文索引
- 优缺点 : 加快检索速度,但需要占用物理内存,对表中数据进行改动,也需要动态维护
9. InnoDB与MyISAM的区别?
指定查询引擎:建表时使用Engine指定查询引擎,charset指定字符集;
区别:
- 事务:MyISAM不支持事务,InnoDB支持事务
- 锁级别:MyISAM只支持表级锁,InnoDB支持行级锁和表级锁,默认使用行级锁,但是行锁只有通过索引查询数据才会使用,否则将使用表锁。行级锁在每次获取锁和释放锁的操作需要消耗比表锁更多的资源。使用行锁可能会存在死锁的情况,但是表级锁不存在死锁
- 主键和外键:MyISAM 允许没有任何索引和主键的表存在,不支持外键。InnoDB的主键不能为空且支持主键自增长,如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键,支持外键完整性约束
10. 索引失效的几种情况
- 模糊查询的时候以"%“开头会导致索引失效,优化:模糊查询避免以”%"开头;
- 使用"or"的时候必须要求使用"or"的字段全都有索引,否则索引会失效,优化:用union代替;
- 使用复合索引的时候没有用左侧的列查找,索引失效;
- 查询条件中索引列参与了运算,索引失效;
- 查询条件中索引列使用了函数,索引失效;