前言
前面也讲了很多知识点,例如常用函数、事务隔离级别、索引、表处理等等。今天带来一篇工作中常常遇到问题以及经验总结
一、spring事务传播和数据库事务
- spring里面,方法嵌套调用外层读取数据和内层读取数据效果和数据库隔离级别有关系
- 可重复读是默认,可不一定常用,乐观锁必不可少
- 死锁、逻辑怪圈、并发场景
二、索引查看、设计
一般走explan执行计划,主要看type、table、key这几个字段
索引原则
- 遵循最左原则(B+树可能匹配不上)
- 不宜过多,因为会影响插入以及DBA操作成本,资源消耗过高
- 区分度较低的字段不适合建立索引(例如男、女)
- 尽量使用组合索引,少用单列索引
- where on group by order by跟着后面字段会创建索引
- 创建了索引,不代表一定会走
三、mysql锁种类
- 行:共享锁、排它锁
- 表:意向锁
- 索引:记录锁
为啥索引被锁住,产生这么高延迟?
并发中可能操作不同行数据,但是索引背锁住了。从而影响删除修改操作,
- 范围:间隙锁
MVCC中锁定一个范围,解决幻读一个问题。插入删除操作锁一个范围,从而阻止其他操作的幻读的影响。
四、innoDB和MyISAM引擎索引
MyISAM和InnoDB结构区别
1、MyISAM的data存的是数据地址。索引是索引,数据是数据。
2、InnoDB的data存的是数据本身。索引也是数据
B树(B-)和B+树区别
1、这两种树结构类似
2、节点区别:
B树每一行都存放数据所有信息。
B+存储的是索引的值,叶子节点才存放节点信息,并且叶子结构有一个指针链表结构,范围查找时候横向遍历更加方便,不需要回溯父节点查找信息
五、可重复读是如何解决幻读问题
- 可重复读并不是直接解决了幻读问题。
- 可重复读是没有幻读问题,是因为通过多版本并发控制的锁(Next-key Lock)的机制来解决。并不是
六、解释下Next-key Lock锁定范围,什么是左开右关
现在锁住了一个表的一个范围(1、2、3)(3、4、5)(5、6),这个时候3-5就不能再插入,这样从而就达到了没有幻读
七、Mysql中binLog、undoLog、redoLog区别
- binLog是数据库级别数据,undoLog、redoLog是innoDB引擎下日志
- binLog是所有操作都会记录的一个作用,相当于大管家
- 因为innoDB支持事务,所以这两个日志是保证事务执行、操作之前、操作之后的一个日志,需要回滚
八、如何产生死锁?
原理
不同线程抢占资源,又在同时等待的时候,就发生死锁
九、高并发数据库读写压力大如何处理
- 物理加持
- 读写分离(带来数据一致性问题)
- 分库分表(热点问题)
- 多部署几个实例,横向扩展
十、什么是索引覆盖和会表
查询了某两列,可能就是需要用到的值,不需要二次回表查询,将结果当成条件来查就能得到你想要的值
十一、left、inner、right、full join、表表关联区别?
- inner join:两表查询,保留完全完全匹配的结果(结果同于表表关联查询)
- left join:返回左表所有数据,右表没匹配得上,返回是空的
- right join:同上相反
- full join:两表查询,返回左右表没有匹配的行