Java知识点学习(第16天)

Innodb是如何实现事务的?

innodb通过Buffer Pool,LogBuffer,Redo Log,Undo Log来实现事务,以一个update语句为例:

  1. innodb在收到一个update语句后,会先根据条件找到数据所在的页,并将该页缓存到Buffer Pool中。
  2. 执行update语句,修改Buffer Pool中的数据,也是内存中的数据。
  3. 针对update语句生成一个RedoLog对象,并存入LogBuffer中。
  4. 针对update语句生成undolog日志,用于事务回滚。
  5. 如果事务提交,那么则把RedoLog对象进行持久化,后续还有其他机制将Buffer Pool中所修改的数据页持久化到磁盘中。
  6. 如果事务回滚,则利用undolog日志进行回滚。

B树和B+树的区别,为什么Mysql使用B+树?

B树的特点:

  1. 节点排序
  2. 一个节点可以存多个元素,多个元素会进行了排序

B+树的特点:

  1. 拥有B树的特点
  2. 叶子节点之间有指针
  3. 非叶子节点上的元素在叶子节点上都冗余了,也就是叶子节点中存储了所有的元素,并且排好顺序

Mysql索引使用的是B+树,因为索引是用来加快查询的,而B+树通过对数据进行排序来提高查询速度的,然后通过一个节点可以存储多个元素,从而可以使得B+树的高度不会太高,在Mysql中一个Innodb页就是一个B+树节点,一个Innodb页默认是16kb,所以一般情况下一颗两层的B+树可以存储2000万行左右的数据,然后通过利用B+树叶子节点存储了所有数据并且进行排序,并且叶子节点之间有指针,可以很好的支持全表扫描,范围查找等SQL语句。

Mysql锁有哪些,如何理解?

按锁粒度分类:

  1. 行锁:锁某行数据,锁粒度最小,并发度高
  2. 表锁:锁整张表,锁粒度最大,并发度低
  3. 间隙锁:锁的是一个区别

还可以分为:

  1. 共享锁:也就是读锁,一个事务给某行加了读锁,其他事务也可以读,但是不能写
  2. 排他锁:也就是写锁,一个事务给某行加了写锁,其他事务不能读,也不能写

还可以分为:

  1. 乐观锁:并不会真正的去锁某行记录,而是通过一个版本号来实现
  2. 悲观锁:上面所有的行锁、表锁等都是悲观锁

在事务的隔离级别的实现中,就需要利用锁来解决幻读。

Mysql慢查询该如何优化?

  1. 检查是否走了索引,如果没有则优化SQL利用索引。
  2. 检查所利用的索引,是否是最优索引。
  3. 检查所查字段是否都是必须的,是否查询了过多字段,查出了多余数据。
  4. 检查表中的数据是否过多,是否应该进行分库分表。
  5. 检查数据库实例所在机器的性能配置,是否太低,是否可以适当增加资源。

你可能感兴趣的:(Java知识点,java,mysql)