JAVA面试题 --- MySql篇(二)

1.说一下数据库的事务隔离?

MySql 的事务隔离是在 MySql.ini 配置文件里添加:

transaction-isolation = XXX

可用的配置值 :READ-UNCOMMITTED  READ-COMMITTED  REPEATABLE-READ  SERLIALIZABLE

  • READ-UNCOMMITTED:未提交读,最低级隔离级别、事务未提交前,就可以被其他事务读取(会出现幻读、脏读、不可重复读)
  • READ-COMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读,不可重复读)
  • REPEATABLE-READ:可重复读,默认级别,保证多次读取同一个数据时,其值都和事务开启时候的内容是一致的,禁止读取到别的事务未提交的数据(会造成幻读)。
  • SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。

2.MySql 常用引擎

  • InnoDB引擎:InnoDB 引擎提供了对数据库 ACID 事务的支持,并且还提供了行级锁和外键的约束,它的设计目标就是处理大数据容量的数据库系统。MySql 运行的时候,InnoDB会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持全文搜索,同时启动也比较慢,它是不会保存表的行数的,所以当进行 select count(*) from table 指令的时候,需要进行扫描全表。由于锁的粒度比较小,写操作是不会锁定全表的,所以在并发度比较高的场景下使用会提升效率。
  • MyIASM引擎:MySql 的默认引擎,但不提供事务的支持,也不支持行级锁和外键。因此当执行插入和更新语句的时候,即执行写操作的时候需要锁定这个表,所以会导致效率降低。不过和InnoDB不同的是,MyIASM引擎是保存了表的行数,于是当进行select count(*) from table 语句时,可以直接的读取已经保存的值而不需要进行全表扫描。所以如果表的读操作远远多于写操作时,并且不需要事务的支持的时候,可以将MyIASM作为数据库引擎的首选。

3.MySql 的行锁 和 表锁

MyISAM 只支持表锁, InnoDB 支持表锁和行锁,默认为行锁。

  • 表级锁:开销小。加锁快,不会出现死锁。锁的粒度大,发生锁冲突的概率最高
  • 行级锁:开销大,加锁慢,会出现死锁。锁粒度小,发生锁冲突的概率小,并发度高。

4.悲观锁和乐观锁

  • 乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下此期间别人有没有去更新这个数据。
  • 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会组织,知道这个锁被释放。

数据库的乐观锁需要自己实现,在表里添加一个 version  字段,每次修改成功 ,值加1,这样每次修改的时候先对比一下,自己拥有的 version 和数据库现在的 version 是否一致,如果不一致就不修改,这样就实现了乐观锁。

5.MySql 问题排查都有哪些手段?

  • 使用 show processlist 命令查看当前所有连接信息。
  • 使用 exolain 命令查询 SQL 语句执行计划
  • 开启慢查询日志,查看慢查询 SQL

6.如何做 MySql 的性能优化?

  • 为搜索字段创建索引
  • 避免使用 select *,列出需要查询的字段。
  • 垂直分割表
  • 选择正确的存储引擎
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值