- 基础:
- 基本存储结构:页(大小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:
JAVA面试——数据库
原文:https://www.cnblogs.com/lhspeppa/p/10461334.html