Java 数据库知识整理

此文记录了自己学习Java 数据库的基础知识,纪念自己面试前的准备。

数据架构

面试:如何设计一个关系型数据库?

  • 逻辑(存储管理、缓存机制、SQL解析、日志管理、权限、容灾、索引管理、锁机制)
  • 存储(文件系统)

数据库索引

面试:为什么要用索引

如果不使用索引,需要使用到全表扫描。
使用索引可以快速的查询数据。

面试:什么样的信息能成为索引?

索引可能的数据结构

  • 二叉查找树进行二分查找
  • 使用B-Tree结构
  • 使用B±Tree结构
  • 建立Hash结构

B+Tree 更适合做存储索引

  • B+树的磁盘读写代价更低
  • B+树的查询效率更加稳定O(logn)
  • B+树更有利于对数据库的扫描

面试:如何定位并优化慢查询SQL

  • 根据慢日志定位慢查询SQL
  • 使用explain等工具分析SQL
  • 修改SQL使其尽量走索引

联合索引的最左匹配原则

MySQL会一直向右匹配直到遇到范围查询(> < between like)就会停止匹配,比如 a=2 and b=3 and c>5 and d=6如果建立的索引是(a b c d),那么d是用不到索引的,如果建立的索引是(a b d c)就可以用到。
= 和 in 可以乱序,如果 a=1 and b=2 and c=3 建立(a b c)索引顺序任意,MySQL可以优化这种形式。

索引建立的越多越好吗

  • 数据量小的表不需要建立索引,索引需要额外的开销
  • 数据变更需要维护索引,更多的索引需要更多的维护成本
  • 索引需要空间

数据库锁

MyISAM与InnoDB关于锁方面的区别

  • MyISAM默认使用的表级锁,不支持行级锁
  • InnoDB默认使用的是行级锁,也支持表级锁

MyISAM表加上读|写锁
lock tables table_name read | write

MyISAM表解锁:
unlock tables;

共享锁:S锁,读锁
排他锁:X锁,写锁

给select语句上排它锁:

select * from table_name for update

InnoDB表加共享锁:

select * from table_name where id=xx lock in share mode;

InnoDB在没有用到索引的时候,用的是表级锁,用到索引的时候,用的是行级锁。

MyISANM、InnoDB适用场景

  • MyISANM适合全表count语句
  • MyISANM适合对数据的增删改频率不高,查询非常频繁
  • MyISANM适合没有事务
  • InnoDB适合增删改频率高
  • InnoDB适合需要事务支持

锁的分类

  • 按粒度分,分为表级锁,行级锁,页级锁
  • 按级别分,分为共享锁,排他锁
  • 按方式分,分为自动锁,显示锁
  • 按使用分,分为乐观锁,悲观锁

事务

ACID

  • 原子性 Atomic
  • 一致性 Consistency
  • 隔离性 Isolation
  • 持久性 Durability

事务隔离级别

事务在并发情况下出现的问题?

  • 更新丢失:事务A的更新记录被事务B的更新回滚了
  • 脏读:事务A读到了事务B没有提交的记录
  • 不可重复读:由于事务B在更新提交事务,事务A每次读取的数据可能都不一样,就算程序能使用了最后一次读到的数据,总感觉不可靠
  • 幻读:对多行数据的操作,事务A读到了多行数据,事务B对数据删除、新增,事务A的更新操作就多了行、少了行。

next-key 锁 (行锁+Gap锁)

语法

GROUP BY

  • 满足’SELECT子句中的列名必须为分组列或函数’
  • 列函数对于GROUP BY子句定义的每一个组返回一个结果

HAVING

  • 通常与GROUP BY子句一起使用
  • WHERE过滤行,HAVING过滤组
  • 出现顺序,WHERE -> GROUP BY -> HAVING

你可能感兴趣的:(面试)