面试题总结——数据库

面试题总结——数据库

  1、数据库范式是什么?

  第一范式:列不可分

  第二范式:有主键,保证完全依赖(若主键是多列则需要同时依赖这多列)

  第三范式:无传递依赖(非主键列A依赖非主键列B,而B依赖主键,这样属于传递依赖,不符合3NF)

  2、char,varchar,text的区别?

  char:长度固定,最大长度255

  varchar:可变长度,可设置最大长度(最大65535)

  text:不设置长度,存储可变长度的非Unicode数据

  3、数据库索引是什么?

  索引是对数据库表中一列或多列的值进行排序的数据结构,以协助快速查询、更新数据库表中数据。

  4、索引的分类有哪些?

  ①主键索引:一个表中,最多有一个主键索引,主键索引的列不可重复也不能为null,效率较高。

  ②唯一索引:一个表中,可有多个唯一索引,唯一索引的列不可重复但可以为null,效率较高。

  ③普通索引:一个表中,可有多个普通索引,普通索引的列可以有重复的值。

  ④全文索引:文章字段或有大量文字的字段进行检索,可使用全文索引机制。(存储引擎必须是MyISAM)

  5、索引的底层原理

  索引底层是一个二叉树,InnoDB使用B+树(log(n))

  6、索引的优缺点?

  提高数据查询效率,但更新需要动态维护,比较耗费时间。

  7、索引创建原则是什么?

  比较频繁作为查询条件的字段应设置索引

  唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件

  更新非常频繁的字段不适合创建索引

  不会再where子句中出现的字段不该创建索引

  8、什么是事务?

  事务是一组DML语句(对数据库中表记录的增删改查)组成,这些语句在逻辑上存在相关性,要么全部成功执行,要么全部失败,是一个整体,是数据库并发控制的基本单位。

  9、事务的特性

  原子性<A>:事务是应用中执行的最小单位,要么全部成功,要么全部失败。

  一致性<C>:事务的执行结果必须使数据库从一个一致性状态,变到另一个一致性状态(若事务执行中系统运行中断,一部分修改已被写入,此时就是不一致状态)

  隔离性<I>:并发执行的事务之间不能相互影响(类似线程)

  持久性<D>:事务一旦被提交,对数据库中数据的改变是永久性的(永久存储其中)

  10、事务并发带来的问题

  脏读:一个事务读取了另一个事务还未提交的数据。

  不可重复读:重点在于修改,同一个事务内重复读取的结果不同,被读取的数据已被其他事务修改(一个事务正在读,另一个事务将数据修改,直接反射到该读事务中了)

  幻读:重点在于新增或删除,同一条件下两次读出来的记录数不同

  11、事务的隔离级别

  ①读未提交:允许一个事务读取其他事务未提交的数据,可导致脏读,不可重复读,幻读,不加锁。

  ②读已提交:允许一个事务读取其他事务已提交的数据,可导致不可重复读,幻读,不加锁。

  ③可重复读:其他事务对数据库的修改在本事务中不可见,可导致幻读(可使用加锁解决),MySQL默认隔离级别,不加锁。

  ④可串行化:只允许事务串行执行(事务只能一个一个执行,不能并发执行)。可避免所有问题,加锁。

  12、如何优化数据库?

  ① 使用explain查询和分析SQL的执行

  ② 表设计遵循三大范式

  ③ 将表根据业务需求进行合理的拆分

  13、什么是视图?

  视图是一个虚拟表,其内容由真实表的查询定义,视图的数据变化会影响到基表,基表的数据变化也会影响到视图。(若视图是单表的一部分,则可以影响,若是多表合成的,会直接报错)

  14、视图的规则与使用限制?

  视图不能添加索引,不能有关联的触发器或默认值,可提高安全性,必须具备足够的访问权限,若从该视图检索数据select中含有order by,则视图中的order会被覆盖。

  15、什么是触发器?

  一张表发生了某个操作(插入、删除、更新操作),然后自动触发了预先编写好的若干条SQL语句的执行。

  16、drop,delete的区别?

  drop:从数据库中删除表,所有的数据行,索引,权限、触发器也会被删除,不能回滚。

  delete:删除表的全部或一部分数据行,属于DML语言,每删除一行,都会在事务日志中记录一下,执行delete后用户需要提交(commit)或回滚(rollback)来执行删除或撤销删除。

  17、悲观锁与乐观锁?

  悲观锁:先获取锁,再进行业务操作,悲观的认为所有的操作均会导致并发安全问题。适合读多写少。(悲观锁类似synchronized锁)

  乐观锁:先进行业务操作,在最后实际更新数据时进行检查数据是否被更新过,若未被更新过,则更新成功,否则,更新失败。适合读少写多。(乐观锁类似CAS操作)

  悲观锁与乐观锁的应用:读多写少适合使用乐观锁,读少写多适合使用悲观锁(乐观锁在不发生取锁失败的情况下开销比悲观锁小,但一旦取锁失败进行回滚则开销比较大,因此乐观锁适合取锁失败概率比较小的场景,读多写少,读操作基本不需要取锁,而写操作必须要取锁,类似于读写锁

18、常见三种引擎的区别?

  InnoDB:支持事务处理,支持外键,有64TB的存储限制。若需要对事务的完整性要求比较高,需要实现并发控制,则选择InnoDB。

  MyISAM:不支持事务和外键,插入速度快,空间和内存使用比较低。若表主要用于数据的插入与读取,读操作远多于写操作,则选择MyISAM。

  MEMORY:不支持事务和外键,所有的数据都在内存中,数据处理速度快,但安全性不高。若表需要很快的读写速度,则需要选择MEMORY。

19、聚簇索引与非聚簇索引?

  聚簇索引:将数据存储与索引放在一块,找到了索引也就找到了数据,一个表仅有一个聚簇索引,一个表的聚簇索引默认是其主键。
  非聚簇索引:将数据与索引分开存储,索引结构的叶子结点指向了数据的对应行。
  对比:聚簇索引再次访问时会在内存中完成访问不必再访问磁盘,获取数据更快。
   聚簇索引使用主键作为指针,减少了当出现当行移动或数据页发生变化时的维护工作,行的位置随着数据库的修改而发生变化。

20、左外连接和右外连接的区别?

  左外连接:结果集包含左表的全部记录以及右表中符合连接条件的记录,如果左表的某行在右表中没有匹配行,则在左外连接的结果集中右表的这些行对应的所有列都为null。
  右外连接:结果集包含右表的全部记录以及左表中符合连接条件的记录,如果右表的某行在左表中没有匹配行,则在右外连接的结果集中左表的这些行对应的所有列都为null。

21、锁机制

  MySQL中的锁主要分为表级锁,行级锁,页级锁。其中表级锁开销比较小,加锁比较快,不会出现死锁,锁定粒度比较大,发生锁冲突的概率最高,并发性最低;而行级锁开销比较大,加锁比较慢,会出现死锁,发生锁冲突的概念最低,并发度也最高;而页面锁的开销和加锁时间界于表锁和行锁之间,会出现死锁,锁定粒度也界于表锁和行锁之间,并发度一般。
  表级锁适用于以查询为主,只有少量按索引条件更新数据的应用,比如WEB应用;行级锁更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值