Skip to content

MySQL 面试问题~~~

事务的四大特性(ACID)简要介绍一下?

原子性:事务是最小的执行单位,不允许分割。

事务的原子性确保动作要么全部完成,要么完全不起作用;

一致性:执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;

隔离性:并发访问数据库时,一个用户的事务不被其他事务所干扰,

各并发事务之间数据库是独立的;

持久性:一个事务被提交之后。它对数据库中数据的改变是持久的,

即使数据库发生故障也不应该对其有任何影响。

数据库三大范式是什么?

  1. 第一范式:每个列都不可以再拆分。
  2. 第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。
  3. 第三范式:在第二范式的基础上,非主键列只依赖于主键,不依赖于其他非主键。 在设计数据库结构的时候,要尽量遵守三范式,如果不遵守,必须有足够的理由。 比如性能,事实上我们经常会为了性能而妥协数据库的设计。

索引设计的原则有哪些?

  1. 适合索引的列是出现在where子句中的列,或者连接子句中指定的列
  2. 基数较小的类,索引效果较差,没有必要在此列建立索引
  3. 使用短索引,如果对长字符串列进行索引,应该指定一个前缀长度,这样能够节省大量索引空间
  4. 不要过度索引,索引需要额外的磁盘空间,并降低写操作的性能。

MySQL分库分表的目的?

分库分表就是为了解决由于数据量过大而导致数据库性能降低的问题,将原来独立的数据库拆分成若干数据库组成, 将数据大表拆分成若干数据表组成,使得单一数据库、单一数据表的数据量变小,从而达到提升数据库性能的目的。

什么是死锁?该如何解决?

死锁是指两个或两个以上的事务在执行过程中,因争夺某一资源而造成的一种互相等待的现象,并请求锁定对方资源,若无外力干涉那它们将无法推进下去, 从而恶行循环的现象。

常见的解决方案如下:

  1. 如果不同程序会并发存取多个表,尽量约定以相同的顺序访问表,可以大大降低死锁机会。
  2. 在同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率。
  3. 对于非常容易产生死锁的业务部分,可以尝试使用升级锁定颗粒度,通过表级锁定来减少死锁产生的概率;如果业务处理不好可以用分布式事务锁或者使用乐观锁。

什么是脏读?幻读?不可重复读?

  1. 脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。

  2. 不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。

  3. 幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

MySQL数据库cpu飙升到100%的话怎么处理?

当 cpu 飙升到 100%时,先用Linux系统命令 top 观察是不是 mysqld 占用导致的,如果不是,找出占用高的进程,并进行相关处理。如果是 mysqld 造成的, 登录数据库,运行show processlist,看看里面跑的 session 情况,是不是有消耗资源的 sql 在运行。找出消耗高的 sql会话, 看看执行计划是否准确,index 是否缺失,或者实在是数据量太大造成。一般来说,肯定要 kill 掉这些线程(同时观察 cpu 使用率是否下降), 等进行相应的调整(比如说加索引、改 sql、改内存参数)之后,再重新跑这些 SQL。也有可能是每个 sql 消耗资源并不多,但是突然之间, 有大量的 session 连进来导致cpu飙升,这种情况就需要跟应用一起来分析为何连接数会激增,再做出相应的调整,比如说限制连接数等。