数据库面试题
DBS DBMS DB 区别
DBS 数据库系统
DBMS 数据库管理系统
DB 数据库
数据库系统 dbs 包括但不限于数据库管理系统 dbms 和数据库 db
MySQL 存储引擎
InnoDB(默认): 支持事物,表锁,行锁设计,支持外键
MyISAM:不支持事物和表锁设计,不支持外键
事物
使用场景
转账:
a 转账给 b,a 账户减少
b 账户增加
过程就要用到事物,转账事物就回滚
解释:一组原子性的 SQL 查询(结合 ACID)
ACID 特性
A: 原子性
C: 一致性
I: 隔离性
D: 持久性
隔离级别(低到高)
read uncommitted(未提交读)
read committed(提交读):大多数数据库默认的级别
repeatable read(可重复读):mysql 默认级别,解决了脏读问题,InnoDB 通过 mvcc 可解决幻读问题
serializable(可串行化):最高的隔离级别,不能并发,解决了幻读问题,会产生超时 锁争用问题
乐观锁与悲观锁
悲观锁
特征(what):每次操作数据都会加锁
常见例子:mysql 中行锁 表锁 读锁 写锁;java 的中重量级锁 synchronized
乐观锁
特征(what):操作数据时不加锁
实现方法(how):通过版本控制和 cas 算法实现
优点:适用于多读的应用类型,可以提高吞吐量
常见例子:java 中的原子变量类(cas 算法)
MVCC 多版本并发控制
是啥(what):
可以认为是行级锁的变种,他在很多情况下避免加锁,花销更低
分类:
乐观并发控制和悲观并发控制
实现(mysal 的 innodb 引擎):
通过在每行记录后面保存两个隐藏的列来实现,一个是保存行的创建时间,一个是保存行的过期时间。不过这里的时间指的是系统版本号
死锁(数据库的)解释现象:两个或两个以上事务在同一资源相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。
并发控制
解决问题:我在读数据,你在删数据的情况
锁分类:
读锁:共享锁,不阻塞
写锁:排他锁,排除其他写锁和读锁。
锁策略
解决问题:提高性能
分类:
表锁:开销最小 行级锁:最大程度支持并发,但开销最大
范式分类
1nf:属性具有原子性
2nf:在 1nf 基础上消除非主属性对主码的部分依赖
3nf:在 2nf 基础上消除传递依赖
范式与反范式
范式:
优点:
更新比反范式快修改数据少表比较小,存在内存中,执行快
缺点:
需要关联
反范式:
优点:
避免关联
缺点:
信息冗余
Char varchar
Char 是定长 剩余空间会用空格填充
Varchar 是可变长
MySQL date、datetime 和 timestamp 类型的区别
https://zhuanlan.zhihu.com/p/…
索引(书的目录)
解决问题(why):方便查找数据
优点:
大大减少服务器需要扫描的数据量
帮助服务器避免排序和临时表
将随机 io 变成顺序 io
缺点:
时间:创建索引,维护索引需要时间
空间:创建索引占用物理空间
创建索引的原则
最左前缀匹配原则,具体在联合索引体现,mysql 会一直向右匹配,当遇到范围查询会停止,此时把范围查询的索引放到最后即可
经常作为查询的字段作为索引
更新频繁的字段不适合做索引
定义有外键的字段一定要做索引
尽量扩展索引,不要重新新建索引
索引分类
按底层数据结构分:
b 数索引(底层是 b + 数)哈希索引空间数据(r-tree)索引全文索引
按逻辑分类
主键索引(特殊的唯一索引,不允许 null 值)单列索引多列索引唯一索引空间索引
Group by
后面接条件时用 having;
一般与 cout()函数一起使用,实现查询重复数据功能
查重:
结果
分页查询(limit(mysql)top(sqlserver))
练习:https://www.nowcoder.com/prac…
解释:limit x,y 表示从 x + 1 行(x 从 0 开始算)开始查询 y 条数据
公众号
欢迎关注公众号 布尔 bl,分享 Java 相关信息技术、生活感悟。