zoukankan      html  css  js  c++  java
  • 数据库面试题

    数据库面试题

     

     

    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类型的区别

    • https://zhuanlan.zhihu.com/p/23663741

    索引(书的目录)

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

    • 优点:

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

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

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

      • 按底层数据结构分:

        b数索引(底层是b+数)
        哈希索引
        空间数据(r-tree)索引
        全文索引

      • 按逻辑分类

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

    Group by ###

    • 后面接条件时用having
    • 一般与cout()函数一起使用,实现查询重复数据功能
    • 查重:
      FX0qfO.pngFX0qfO.png
    • 结果
      FX0vXd.pngFX0vXd.png

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

    • 练习:
      https://www.nowcoder.com/practice/f24966e0cb8a49c192b5e65339bc8c03?tpId=82&tqId=29823&tPage=3&rp=&ru=/ta/sql&qru=/ta/sql/question-ranking

    • 解释:limit x, y 表示从x+1行(x从0开始算)开始查询y条数据

    公众号

    • 欢迎关注公众号 布尔bl ,分享Java相关信息技术、生活感悟。
  • 相关阅读:
    打印出从1到最大的n位十进制数
    排序算法--(二)
    排序算法 (-)
    两个栈实现一个队列
    C++ 模板类解析
    根据先序遍历中序遍历重建二叉树
    格式化时间
    用js实现冒泡排序
    接口和抽象类的区别
    解析json
  • 原文地址:https://www.cnblogs.com/chenzhuantou/p/10255967.html
Copyright © 2011-2022 走看看