一、基础篇
1、什么叫视图?游标是什么?
视图:
-
1)视图是多个基础表根据某些条件组合而成的结果集,一般来说只能select,不能进行update、insert、delete等操作,因为它是虚拟的内存表。
-
2)视图 VS 表 <==> 快捷方式 VS 文件
游标:数据缓冲区,存放SQL语句执行结果,用户可以从中逐一获取记录进行处理。
2、drop、delete与truncate的区别
3、什么是触发器?
4、CURD是什么?C是什么?
Create-增加,Retrieve-读取,Update-更新,Delete-删除。
5、MySQL有哪些类型?
主要分为:数值型、日期时间和字符串型。
注意:
- 无符号上限取值为原来2倍;货币精确等精确数字场景必须使用DECIMAL类型;
- 时间分类:年月日-DATE,年月日时分秒-DATETIME,时分秒-TIME;TIMESTAMP与时区相关。
- 字符串:CHAR创建时固定为表明长度,VARCHAR值为可变长字符串。
6、int和varchar;int占多少位?
类型 | 大小 | 有符号范围 | 无符号范围 |
---|---|---|---|
int | 4 bytes | − 2 32 -2^{32} −232 ~ 2 31 − 1 2^{31} − 1 231−1 | 0 0 0 ~ 2 32 − 1 2^{32} − 1 232−1 |
varchar(M) | 0~65536 bytes | – | 0~M个字节的变长字符串 |
7、数据库去重操作;
- 1)rowid:Oracle常用,其他需要声明字段。
# 删除表1和表2 中name相同的所有数据
delete from table1 a
where rowid !=( select max(rowid) from table2 b
where a.name1 = b.name1 and a.name2 = b.name2 ……
)
- 2)group by:主要用于分组统计,一般在聚合函数中使用
# 删除表中num列所有重复的数据
delete from student
Group by num
having count(num)>1
- 3)distinct:一般用于比较小的表进行去重,过滤掉多余的重复记录
select distinct name from student
8、SQL的group by、order by作用;having和where区别?
1)group by VS order by
- 作用:group by:分组,常与聚合函数结合使用;order by:排序;
2)having VS where
- 对象:where作用于基表或视图,从中选择满足条件的元组;having作用于组,从中选择满足条件的组。
9、设计学生成绩管理系统,符合第三范式要求,并绘出UML图。
……
10、数据库事务(*2)含义?
数据库事务不可分割的数据库操作序列,也是数据库并发控制的基本单位,其执行结果必须使数据库从一致性状态变到另一种一致性状态。
11、如何保证一致性。
数据库层面:MVCC–RR、日志、2PL;应用层面:……
二、进阶篇(一)
1、存储过程
1、定义:事先编译并存储在数据库中一段SQL语句的集合。
2、优缺点
序号 | 优点 | 缺点 |
---|---|---|
1 | 重复使用,一次开发编译即可 | 移植性差 |
2 | 减少网络流量,只需传名称和参数到服务器 | 引用关系对象改变时会影响,需要重新编译或报错 |
3 | 安全性高,只有某些用户可使用 | 维护难,数据结构变化,存储过程需要变化 |
2、联合/组合索引
举例:(name, age) 联合索引分析:
可以看到索引项是按照索引定义出现字段顺序排序。当你的逻辑需求是查到所有名字是“张三”的人时,可以快速定位到ID4,然后向后遍历得到所有需要的结果。
SQL查询条件是where name like ‘张%’,也能够用上这个索引,查找到第一个符合条件的记录是ID3,然后向后遍历,直到不满足条件为止。
可以看到,不只是索引全部定义,只要满足最左前缀,就可以利用索引加速检索。这个最左前缀可以是联合索引的最左N个字段,也可以是字符串索引的最左M个字符。
3、页分裂含义及负面影响?
叶分裂指B+树插入新值时,数据页已满,需要申请新的数据页,然后挪动部分数据过去的情况。这种情况会造成性能下降,数据页的利用率下降,补充一下,叶分裂的逆过程-合并也比较耗费性能。
4、什么场景适合业务字段直接做主键?
典型KV场景:1)只有一个索引;2)该索引必须是唯一索引。
由于没有其他索引,所以不用考虑其他索引叶子节点大小的问题。优先考虑“尽量使用主键查询”原则,直接将这个索引设置为主键,可以避免每次查询需要搜索两棵树。
5、覆盖索引
SQL:select ID from T where k between 3 and 5;
此时索引k已经“覆盖了”我们的查询请求,所以称为覆盖索引。覆盖索引不用回表,能减少树的搜索次数,显著提升查询性能,是常见的性能优化手段。
6、手写创建索引语句;
CREATE INDEX index_name
ON table_name (column_name)
7、MongDB存储引擎。
特点 | WiredTiger | inMemory |
---|---|---|
持久化 | 存到Disk Files中 | 存到Cache中 |
并发 | 大多数读写操作使用乐观并发控制 | 文件级别并发控制,多个写操作同一个文档必须以序列化方式执行 |
异常/崩溃 | 通过日志文件可还原到Checkpoint操作之后发生的数据更新 | 数据会丢失 |
三、进阶篇(二)
1、数据库死锁,如何防止?
答:
-
发生死锁情形
1)一个线程两次加锁;
2)两个线程互相申请对方的锁,但都不释放。 -
死锁产生必要条件 及 预防
1)互斥:一次只有一个进程可使用一个资源,其他进程不能访问已分配给其他进程的资源。
–>设备固有属性决定,不能改变。
2)占用且等待:当一个进程在等待分配得到其他资源时,其继续占有已分配得到的资源。
–>可以要求进程一次性请求所有需要的资源,比较低效。
3)非抢占:不能强行抢占进程中已占有的资源。
–> 如果占有某些资源的一个进程的进一步资源请求被拒绝,则该进程必须释放最初占有资源。
–>如果一个进程请求当前被另一个进程占有的一个资源,则操作系统可以抢占另一个进程,要求它释放资源。
4)循环等待:存在一个封闭进程链,使得每个资源至少占有此链中下一个进程所需要的一个资源。
–>如果一个进程已经分配了R类资源,那么接下来请求资源只能是排在R类型之后的资源类型,比较低效。 -
处理死锁4种办法:死锁预防、检测、避免、解除。
办法 | 内容 |
---|---|
预防 | 破坏1个必要条件 |
检测 | 检查结构,及时清除 |
避免 | 进程启动拒绝、不允许分配【银行家算法】 |
解除 | 资源剥夺法、撤销进程法 |
2、备份恢复
……