以上是面试重要的知识点,给大家过一遍。
mysql5.1之前是 Myisam
mysql默认的引擎是 InnoDB,因其支持 transaction事务
以下是各个引擎所支持的内容:
隔离级别经常问:
没有隔离好,会有什么问题?
四种隔离级别分别解决哪些问题?
mysql锁的范围是 表级锁、行级锁
读取一行的时候,需要加共享锁,这时候 读取,别人不能读,不能更新
更新的时候要加排他锁,这样更新的时候 别人不能读,不能更新
意向共享锁,加s锁之前要加;意向共享锁的意思是准备加s锁
NK表示使用范围查询的时候,比如id大于几,小于几,对范围内不存在的记录加锁
事务1加了IS,事务2加了X,则发生冲突
事务1加了意向共享锁,则事务2不能加 意向排他锁
间隙锁是当使用范围查询的时候,比如id大于多少、小于多少,一查 查到多条 数据
比如 id为101 102 103时,其给不存在 的记录id=104、105…等等加锁
如何加锁呢?
DML语句:
Insert插入
Update修改更新
Delete删除
Select选择
DQL语句 查询不会对数据库中的数据进行修改.只是一种显示数据的方式
之前讲过,行级锁会出现死锁的现象,
如下场景:
事务1 更新 T表,先更新ID=1 这条记录,然后更新ID=2的记录
事务2 正好相反,先更新 ID=2 这条记录,后更新ID=1的记录
然后事务1想更新 id2,发现其被 事务2锁住
事务2 想更新id1,发现其被事务1锁住
这时产生死锁
inndb比较智能,会自动解决死锁的问题,
或者设置超时等待参数,如果事务在执行过程中超过了这个时间,则自动回滚
出现死锁 是因为 程序逻辑有缺陷,所以要避免写出这样的代码:
刚刚讲的MYSQL的锁,我们统称为悲观锁(数据库加的锁都是悲观锁,天生认为不加锁 一定会出问题)
如果不用数据库的锁机制,自己实现的话,都是乐观锁(自定义),一般不会发生问题,发生了我也能解决
更新数据频繁的话,用悲观锁比较好。
更新数据不频繁的话,用乐观锁
无锁算法:利用无锁的方式,实现有锁的感觉
自旋操作:a线程对数据加锁,此时b线程想要数据,则b会循环等待其解锁,循环几乎没有时间间隔,只要解锁,马上就能感觉到。但是阻塞时间间隔相对较大,效率没有循环的方式高
mysql事务是保证数据的一致性,完整性等等,是为了保证安全层面的话题,那么索引是为了提高查询的效率
InnoDB采用 B+Tree
上面讲完了 MYsql
接下来将redis,重点是数据类型
注:key其实就是一种字符串
单位:
sort set表示有序集合
redis过期策略:
如果我们把redis的key设置了过期时间,那么:
如果一过期就删掉的话,效率会变低