JAVA面试——数据库

 

    • 基础:
      • 基本存储结构:页(大小16KB)
      • 各个数据页组成双向链表,每个数据页的记录组成单向链表
    • 索引:
      • 数据库中一个或几个列以特定数据结构存储(B-Tree Hash),减少查找时间(将无序的数据变成有序)
    • 聚簇索引 & 非聚簇索引:
      • 按照数据存放的物理位置为顺序,提高多行检索速度
      • 加快单行检索
    • 聚集索引 & 非聚集索引:
      • 聚集索引:
        • 以主键创建的索引
        • 叶子节点存放表中数据
      • 非聚集索引
        • 以非主键创建的索引
        • 叶子节点存放主键和索引列
        • 覆盖索引:把要查询出来的列和索引是对应的(主键+值)
    • 唯一索引 & 主键索引 & 聚集索引: 
      • 不允许两行具有相同索引值的索引
      • 主键值唯一,使用主键进行索引时,允许对数据的快速访问
      • 行的物理顺序与逻辑顺序相同,数据访问速度更快
    • B-树(平衡多路查找树)
      • 每个节点最多有m个分支
      • 节点有n-1个关键字,有n个分支
      • 叶子节点处于同一层
      • 根节点不是叶子节点至少2个分支,非根非叶子节点至少有ceil(m/2)个分支
    • B+树
      • 分支数=索引数
      • 每个节点大小等于一页的大小(16KB)
      • 顺序扫描速度快
      • 通过顺序访问指针提高区间查询性能
      • 磁盘预读特性,相邻节点预先载入
      • InnoDB B+Tree索引:主索引、辅助索引
        • 主索引:叶子节点data域记录完整数据记录,聚簇索引
        • 辅助索引:叶子节点data域记录主键值
    • 哈希索引
      • 键值换算成新的哈希值,根据哈希值定位
      • 不适合范围查询检索
      • 无法利用索引完成排序
      • 不适合多列联合索引的最左匹配规则
        • 最左匹配规则:复合索引,会首先对最左边的数据进行排序,一直向右匹配直到遇到范围查询
    • 数据库事务:
      • 作为单个逻辑工作单元执行的一系列操作
      • 提供隔离方法,防止相互干扰
      • 提供从失败恢复正常的方法
      • ACID
    • 数据库隔离级别:
      • 脏读
        • A读取B已经更新但是未提交的事务,B回滚后A读到的就是临时无效的内容
      • 不可重复读
        • A事务需要读取一个字段两次,两次读取过程中,B更新了字段,导致A两次读取的内容值不同
      • 幻读
        • A读取若干行数据,B插入或删除等方式修改A读取的结果集;与不可重复读的区别在于,幻读是增加或删除行,不可重复读是修改
      • 四个隔离级别
        • 读未提交(脏读)
        • 读已提交(不可重复读)、语句级别的快照
        • 可重复读(幻读)事务级别的快照
        • 串行:事务一个接一个串行执行,不能并发
    • 锁的种类
      • 内容
        • 表锁(MySQL)
        • 页锁(BerkeleyDBA)
        • 行锁(InnoDB)
      • 性质
        • 共享锁(S) :SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE
        • 独占锁、排他锁(X):SELECT * FROM table_name WHERE ... FOR UPDATE
        • 更新锁(意向锁)
      • 悲观锁与乐观锁
        • 悲观锁
          • 数据处理过程中,数据处于锁定状态
          • 依靠数据库的锁机制
          • 举例:select * from xxx for update (for update相当于加排他锁)
        • 乐观锁
          • 悲观锁性能开销大(长事务)
          • 基于数据版本
      • 间隙锁GAP
        • 对符合条件范围内的已有数据记录的索引项加锁,同时也会对间隙加锁
        • 在可重复读隔离级别下使用
        • 防止幻读
    • 数据库范式:
      • 第一范式:强调列的原子性,列不能拆分
      • 第二范式:一个表有一个主键,没有包含在主键中的列完全依赖于主键
      • 第三范式:非主键列必须直接依赖于主键,不能存在传递以来
    • PrepareStatement & Statement区别
      • PrepareStatement预编译后放在缓存中,下次执行无需编译,更加安全,避免SQL注入
      • 优点:
        • 防注入攻击
        • 多次执行速度快
        • 防止数据库缓冲区溢出
        • 代码可维护性高
    • 内连接(inner join)、左外连接(left outer join)、右外链接(right outer join)、自然连接
    • 数据库缓存性能优化:
      • 将磁盘IO转化为内存IO
      • Query cache:
        • 针对select,缓存ResultSet
        • 对sql语句hash,在query cache中找缓存
        • 数据变化频繁时效率低
      • binlog cache size:
        • 二进制日志记录
posted @ 2019-01-08 21:17  李怕怕  阅读(217)  评论(0编辑  收藏  举报