数据库面试题
数据库面试题
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/23663741
索引(书的目录)
-
解决问题(why):方便查找数据
-
优点:
- 大大减少服务器需要扫描的数据量
- 帮助服务器避免排序和临时表
- 将随机io变成顺序io
-
缺点:
- 时间:创建索引,维护索引需要时间
- 空间:创建索引占用物理空间
-
创建索引的原则
- 最左前缀匹配原则,具体在联合索引体现,mysql会一直向右匹配,当遇到范围查询会停止,此时把范围查询的索引放到最后即可
- 经常作为查询的字段作为索引
- 更新频繁的字段不适合做索引
- 定义有外键的字段一定要做索引
- 尽量扩展索引,不要重新新建索引
-
索引分类
-
按底层数据结构分:
b数索引(底层是b+数)
哈希索引
空间数据(r-tree)索引
全文索引 -
按逻辑分类
主键索引(特殊的唯一索引,不允许null值)
单列索引
多列索引
唯一索引
空间索引
-
Group by ###
- 后面接条件时用having;
- 一般与cout()函数一起使用,实现查询重复数据功能
- 查重:
FX0qfO.png - 结果
FX0vXd.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相关信息技术、生活感悟。