为了账号安全,请及时绑定邮箱和手机立即绑定

数据库面试题

标签:
Java MySQL

DBS DBMS DB区别

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

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

MySQL存储引擎

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

事物

  • 使用场景

  • 转账:

    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(可串行化):最高的隔离级别,不能并发,解决了幻读问题,会产生超时 锁争用问题

乐观锁与悲观锁

  • 悲观锁
    • 特征(what):每次操作数据都会加锁
    • 常见例子:mysql中行锁 表锁 读锁 写锁 ;java的中重量级锁synchronized
  • 乐观锁
    • 特征(what):操作数据时不加锁
    • 实现方法(how):通过版本控制和cas算法实现
    • 优点:适用于多读的应用类型,可以提高吞吐量
    • 常见例子:java中的原子变量类(cas算法)

MVCC多版本并发控制

  • 是啥(what):
    • 可以认为是行级锁的变种,他在很多情况下避免加锁,花销更低
  • 分类:
    • 乐观并发控制和悲观并发控制
  • 实现(mysal的innodb引擎):
    • 通过在每行记录后面保存两个隐藏的列来实现,一个是保存行的创建时间,一个是保存行的过期时间。不过这里的时间指的是系统版本号

死锁(数据库的)

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

并发控制

  • 解决问题:我在读数据,你在删数据的情况
  • 锁分类:
    • 读锁:共享锁,不阻塞
    • 写锁:排他锁,排除其他写锁和读锁。
  • 锁策略
    • 解决问题:提高性能
    • 分类:

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

范式分类

  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相关信息技术、生活感悟。
点击查看更多内容
1人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
8
获赞与收藏
52

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消