关于数据库的几个面试题

关于数据库的几个面试题

1.了解数据库存储有哪些引擎?

存储引擎主要有: 1. MyIsam , 2. InnoDB(后面三种不了解) , 3. Memory, 4. Archive, 5. Federated 。

1.MyIsam

  • MyIASM是MySQL默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当 INSERT(插入)或 UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些.

  • ISAM 执行读取操作的速度很快,而且不占用大量的内存和存储资源。在设计之初就预想数据组织成固定长度的记录,按顺序存储的。—ISAM 是一种静态索引结构。

  • 缺点: 不支持事务处理。

2.InnoDB

InnoDB 底层存储结构为B+树, B树的每个节点对应innodb的一个page,page大小是固定的,其中非叶子节点只有键值,叶子节点包含完成数据。

如图为一个简单的2层B+树:

06131609_BDJp.png

它的使用场景是:

1)经常更新的表,适合处理多重并发的更新请求;

2)支持事务;

3)可恢复(通过 bin-log 日志等);

4)外键约束。只有它支持外键;

5)支持自动增加列属性 auto_increment。

2.什么是索引?它是什么样的数据结构?

索引(Index)是帮助 MySQL 实现高效获取数据的数据结构。索引的数据结构和具体存储引擎的实现有关, 在MySQL中使⽤较多的索引有Hash索引,B+树索引等,⽽我们经常使⽤的InnoDB存储引擎的默认索引实现为:B+树索引.

3.谈谈对事务和ACID的理解?

事务是数据库操作的最小工作单元,是作为单个逻辑工作单元执行的一系列操作;这些操作作为一个整体一起向系统提交,要么都执行、要么都不执行;事务是一组不可再分割的操作集合(工作逻辑单元);

然后事务必须有的四个属性,简称ACID属性:

  • A=Atomicity(原⼦性):就是上⾯说的,要么全部成功,要么全部失败.不可能只执行一部分操作.

  • C=Consistency(一致性):系统(数据库)总是从⼀个⼀致性的状态转移到另⼀个⼀致性的状态,不会存在中间状态.

  • I=Isolation(隔离性):通常来说:⼀个事务在完全提交之前,对其他事务是不可见的.注意前⾯的通常来说加了红色,意味着有例外情况.

  • D=Durability(持久性):⼀旦事务提交,那么就永远是这样子,哪怕系统崩溃也不会影响到这个事务的结果.

4.多事务并发可能会发生什么情况?

多事务并发可能会出现这些的情况:

  • 脏读: A事务读取到了B事务未提交的内容,⽽B事务后⾯进⾏了回滚.那么A读取到的数据是脏数据。

  • 不可重复读: 事务A多次读取同一个数据,B事务就在A读取的过程中就一直偷偷的改然后提交,这样导致A每次都读的都不一样。

  • 幻读: A事务读取了⼀个范围的内容,⽽同时B事务在此期间插⼊了⼀条数据.造成"幻觉".

  • 脏读:指读到了其他事务未提交的数据.

    不可重复读与幻读都是读到其他事务已提交的数据,但是它们针对点不同.
    不可重复读:update. 幻读:delete,insert.(幻读与不可重复读相比是有数据量的变化,存在增删数据)

5.这些情况如何避免呢?

讲到如何处理 就得涉及到 MySQL的四种隔离机制:

  • 读未提交,该隔离级别允许脏读,其隔离级别是最低的。换句话说,如果⼀个事务正在处理某⼀数据,并对其进行了更新,但同时尚未完成事务,因此还没有提交事务;而以此同时,允许另⼀个事务也能够访问该数据。
  • 读已提交是不同的事务执行的时候只能获取到已经提交的数据。 这样就不会出现上面的脏读的情况了。但是在同⼀个事务中执行同⼀个读取,结果不⼀致。
  • 可重复读就是保证在事务处理过程中,多次读取同⼀个数据时,该数据的值和事务开始时刻是⼀致的。因此该事务级别限制了不可重复读和脏读,但是有可能出现幻读的数据。
  • 顺序读是最严格的事务隔离级别。它要求所有的事务排队顺序执行,即事务只能⼀个接⼀个地处理,不能并发。
  • 所以安全和性能它们两之间总有一个要多牺牲些。

隔离级别与并发现象之间的关系:

事务隔离级别脏读不可重复读幻读
读未提交允许允许允许
读已提交禁止允许允许
可重复读禁止禁止不一定
顺序读(可串行化)禁止禁止禁止

然后再根据不同的隔离级别给它上不同的锁:

  1. 读未提交(RU): 有行级的锁,没有间隙锁。它与RC的区别是能够查询到未提交的数据。
  2. 读已提交(RC):有行级的锁,没有间隙锁,读不到没有提交的数据。
  3. 可重复读(RR):有行级的锁,也有间隙锁,每次读取的数据都是⼀一样的,并且没有幻读的情况。
  4. 序列列化(S):有行级锁,也有间隙锁,读表的时候,就已经上锁了

6.为什么要尽量设定⼀个主键?主键使用自增ID还是UUID?

  • 主键的必要性:

    主键是数据库确保数据⾏在整张表唯⼀性的保障,即使业务上本张表没有主键,也建议添加⼀个⾃增⻓的ID列作为主键.设定了主键之后,在后续的删改查的时候可能更加快速以及确保操作数据范围安全.

  • 主键的使用:

    推荐使用自增ID;

    因为在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,也就是说,主键索引的B+树叶⼦节点上存储了主键索引以及全部的数据(按照顺序),如果主键索引是⾃增ID,那么只需要不断向后排列即可,如果是UUID,由于到来的ID与原来的大小不确定,会造成⾮常多的数据插⼊,数据移动,然后导致产⽣很多的内存碎⽚,进⽽造成插⼊性能的下降.
    总之,在数据量⼤⼀些的情况下,⽤⾃增主键性能会好⼀些.

7.字段为什么要求定义为not null?

null值会占⽤更多的字节,且会在程序中造成很多与预期不符的情况.

8.InnoDB和MyISAM有什么区别?

  • InnoDB⽀持事物,⽽MyISAM不⽀持事物
  • InnoDB⽀持⾏级锁(支持事务和行级锁是其最大特色),⽽MyISAM只⽀持表级锁
  • InnoDB⽀持MVCC, ⽽MyISAM不⽀持
  • InnoDB⽀持外键,⽽MyISAM不⽀持
  • InnoDB不⽀持全⽂索引,⽽MyISAM⽀持
  • InnoDB没有保存表的总行数(只能遍历),⽽MyISAM保存了总行数
  • InnoDB较适于增删改数据,⽽MyISAM适合于查询数据

9.MySQL中的varchar和char有什么区别.

  • char是⼀个定长字段,假如申请了char(10)的空间,那么⽆论实际存储多少内容.该字段都占⽤10个字符,而varchar是变长的,也就是说申请的只是最⼤长度,占⽤的空间为实际字符长度+1,最后⼀个字符存储使⽤了多长的空间.
  • 在检索效率上来讲,char > varchar,因此在使⽤中,如果确定某个字段的值的长度,可以使用char,否则应该尽量使⽤varchar.例如存储用户MD5加密后的密码,则应该使用char.

10.varchar(10)和int(10)代表什么含义?

  • varchar的10代表了申请的空间长度,也是可以存储的数据的最大长度。
  • ⽽int的10只是代表了展示的长度,不⾜10位以0填充.也就是说,int(1)和int(10)所能存储的数字大小以及占用的空间都是相同的,只是在展示时按照长度展示.

参考资料:https://juejin.im/post/6844903894351347719

最后强烈安利这个:一千行 MySQL 学习笔记(这里面指令很全)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值