数据库面试题

数据库面试题

DBS DBMS DB区别

  1. DBS 数据库系统
  2. DBMS 数据库管理系统
  3. DB 数据库

数据库系统dbs包括但不限于数据库管理系统dbms和数据库dbjava

MySQL存储引擎

  1. InnoDB(默认):支持事物,表锁,行锁设计,支持外键
  2. MyISAM:不支持事物和表锁设计,不支持外键

事物

  • 使用场景
  • 转帐:mysql

    1. a转帐给b,a帐户减小
    2. b帐户增长
    3. 过程就要用到事物,转帐事物就回滚
  • 解释:一组原子性的SQL查询(结合ACID)
  • ACID特性面试

    • A:原子性
    • C:一致性
    • I:隔离性
    • D:持久性
  • 隔离级别(低到高)算法

    1. read uncommitted(未提交读)
    2. read committed(提交读):大多数数据库默认的级别
    3. repeatable read (可重复读):mysql默认级别,解决了脏读问题,InnoDB经过mvcc可解决幻读问题
    4. serializable(可串行化):最高的隔离级别,不能并发,解决了幻读问题,会产生超时 锁争用问题

乐观锁与悲观锁

  • 悲观锁sql

    • 特征(what):每次操做数据都会加锁
    • 常见例子:mysql中行锁 表锁 读锁 写锁 ;java的中重量级锁synchronized
  • 乐观锁数据库

    • 特征(what):操做数据时不加锁
    • 实现方法(how):经过版本控制和cas算法实现
    • 优势:适用于多读的应用类型,能够提升吞吐量
    • 常见例子:java中的原子变量类(cas算法)

MVCC多版本并发控制

  • 是啥(what):服务器

    • 能够认为是行级锁的变种,他在不少状况下避免加锁,花销更低
  • 分类:数据结构

    • 乐观并发控制和悲观并发控制
  • 实现(mysal的innodb引擎):并发

    • 经过在每行记录后面保存两个隐藏的列来实现,一个是保存行的建立时间,一个是保存行的过时时间。不过这里的时间指的是系统版本号

死锁(数据库的)

  • 解释现象:两个或两个以上事务在同一资源相互占用,并请求锁定对方占用的资源,从而致使恶性循环的现象。

并发控制

  • 解决问题:我在读数据,你在删数据的状况
  • 锁分类:mvc

    • 读锁:共享锁,不阻塞
    • 写锁:排他锁,排除其余写锁和读锁。
  • 锁策略

    • 解决问题:提升性能
    • 分类:

      表锁:开销最小
      行级锁:最大程度支持并发,但开销最大

范式分类

  1. 1nf:属性具备原子性
  2. 2nf:在1nf基础上消除非主属性对主码的部分依赖
  3. 3nf:在2nf基础上消除传递依赖

范式与反范式

  • 范式:

    • 优势:

      更新比反范式快
      修改数据少
      表比较小,存在内存中,执行快
    • 缺点:

      须要关联
  • 反范式:

    • 优势:

      避免关联
    • 缺点:

      信息冗余

Char varchar

  • Char是定长 剩余空间会用空格填充
  • Varchar是可变长

MySQL date、datetime和timestamp类型的区别

索引(书的目录)

  • 解决问题(why):方便查找数据
  • 优势:

    • 大大减小服务器须要扫描的数据量
    • 帮助服务器避免排序和临时表
    • 将随机io变成顺序io
  • 缺点:

    • 时间:建立索引,维护索引须要时间
    • 空间:建立索引占用物理空间
  • 建立索引的原则

    • 最左前缀匹配原则,具体在联合索引体现,mysql会一直向右匹配,当遇到范围查询会中止,此时把范围查询的索引放到最后便可
    • 常常做为查询的字段做为索引
    • 更新频繁的字段不适合作索引
    • 定义有外键的字段必定要作索引
    • 尽可能扩展索引,不要从新新建索引
  • 索引分类

    • 按底层数据结构分:

      b数索引(底层是b+数)
      哈希索引
      空间数据(r-tree)索引
      全文索引
    • 按逻辑分类

      主键索引(特殊的惟一索引,不容许null值)
      单列索引
      多列索引
      惟一索引
      空间索引

Group by

  • 后面接条件时用having
  • 通常与cout()函数一块儿使用,实现查询重复数据功能
  • 查重:

FX0qfO.png

  • 结果

FX0vXd.png

分页查询(limit(mysql) top(sqlserver))

公众号

  • 欢迎关注公众号 布尔bl ,分享Java相关信息技术、生活感悟。

相关文章
相关标签/搜索