数据库面试相关知识
答案主要是简略回答,可以根据情况适当扩展。
一.索引
1.数据结构
有Hash索引和Btree索引,Hash索引主要是hash表的数据结构,适用于单条记录查询,其余场景适合Btree索引。
mysql使用B+树索引。
B树和B+树区别:B+树值都存在叶节点,B树值都存在中间节点,B+树IO次数会比较少,B+树叶节点是链起来的,可以顺序查找。
例举一个顺序查找的场景:有序输出所有情况即可使用叶节点顺序遍历的结果。
2.myisam与innodb实现
myisam是非聚簇索引,b+树叶节点存的是地址。
innodb是聚簇索引,直接是存的值。分为主索引和辅助索引,主索引一遍查找即可找到值,辅助索引需要找到主键再遍历一遍主索引。
主索引即覆盖索引,即一次找到数据,不需要再走一遍主索引。
3.聚簇索引、非聚簇索引、覆盖索引
见2
4.索引分类(普通索引、唯一索引、主键索引)
5.最左匹配原则
假设索引(a, b)
a and b 可以用索引
b and a 可以用索引(即使顺序是反过来的,只要能找到最左的a即可)
b 不可用索引
6.索引优缺点
优点:
1.唯一索引保证数据库每一行数据唯一性;
2.加快数据检索速度;
3.随机IO变为顺序IO;
缺点:
1.索引需要维护;
2.索引占用物理空间。
二.事务
1.ACID(原子性,一致性,隔离性,持久性)
2.并发操作的问题(脏读,不可重复读,幻读)
脏读是指读了其他事务未提交的数据;
不可重复读是指同一事务两次读数据结果不同;
幻读是指一事务再两次读过程中发现第二次数据多了,因为其他事务写了数据。
3.隔离级别(读未提交,读已提交,可重复读,串行化)
读未提交会造成脏读,不可重复度,幻读;
读已提交解决脏读;
可重复度解决不可重复读,脏读的问题;
串行化解决所有问题,效率最低。
4.可重复读实现原理MVCC
MVCC基本可以解决所有问题,但可能出现幻读。
三.锁
乐观锁:先不加锁,操作之后判断数据是否一致,不一致回滚。
悲观锁:直接加锁,其他事务需要得到锁才能操作数据。
死锁:A,B同时需要1,2资源,A持有1,B持有2,二者一直处于等待状态,且不释放自己的资源。
四.存储引擎
myisam和innodb。
1.count运算:myisam有meta-data,count(*)运算不需要消耗很多资源,innodb没有这种缓存。
2.事务和崩溃后的安全恢复:myisam查询速度更快,但是不支持事务和崩溃修复,innodb支持事务以及崩溃修复能力。
3.myisam不支持外键,innodb支持。
现在mysql默认innodb
五.MYSQL数据结构
1.INT范围(-2^16 —— 2^16)
2.int(11)含义(小于11位补0显示)
3.char和varchar区别(varchar可以自动缩小所占空间,空间换时间)
六.内连接、左连接、右连接
内连接:两表公共部分
左连接:以左表为基准,右表没有则为空
右连接:同理。
七.数据库范式
八.sql
1.查询所有学科都及格的学生
select name from stu group by name having min(score)>=80;
2.查询第二高薪水
select max(salary) from employee where salary < (select max(salary) from employee);
3.查询所有功课平均分超过60的同学们和他的平均分
select name, avg(score) as avg_score from student group by name having avg(score) >= 60 order by avg_score desc;