数据库开发面试问题汇总

1.索引有哪些类型?

就不同的算法结构来说,索引有B+树、有序数组、哈希等;
就DDL来说,可为字段创建普通索引、唯一索引、主键索引、全文索引,并可指定索引的算法结构。

2.什么是聚簇索引?

mysql的innodb引擎对应的主键索引类型属于聚簇索引、myisam引擎对应的是非聚簇索引,聚簇索引和非聚簇索引都是采用B+树的算法结构,区别在于叶子节点保存的是数据本身还是数据的实际位置。

3.事务是如何保证数据的准确性的?

通过ACID特性来保证的,即原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
原子性:最小执行单位,要么所有操作都成功,要么都失败
一致性:就是业务逻辑的前后一致,比如微信群里发红包,最后群里用户的账户总额都是与初始一致的。
隔离性:根据业务需要和并发程度来选择隔离级别,有四种隔离级别可选,分别是读未提交,读提交,可重复读,窜行化。
持久化:对数据的操作会被持久化到磁盘,不能再回滚。

4.innodb引擎的优缺点?

优点:支持事务,适合大数据量、高并发的业务
缺点:查询数据总量需要逐行扫描,当表里的数据量大时,这个操作会很耗费资源和时间。
(myisam引擎统计全表数据总量会很快,因为总数会自动记录,可以直接获取。但是统计有条件筛选的范围总数则与innodb引擎相似)

5.视图

什么是视图

视图是虚表,只是对查询语句的封装,查询结果随基表的变动而变动,修改视图实际上还是修改基表。

为什么要使用视图

有的时候,我们可能只关系一张数据表中的某些字段,而另外的一些人只关系同一张数据表的某些字段…
那么把全部的字段都都显示给他们看,这是不合理的。
我们应该做到:他们想看到什么样的数据,我们就给他们什么样的数据…一方面就能够让他们只关注自己的数据,另一方面,我们也保证数据表一些保密的数据不会泄露出来…
(视图并不能提高查询效率)

6.drop、delete与truncate分别在什么场景之下使用?

对比一下他们的区别:
drop table

1)属于DDL
2)不可回滚
3)不可带where
4)表内容和结构删除
5)删除速度快

truncate table

1)属于DDL
2)不可回滚
3)不可带where
4)表内容删除
5)删除速度快

delete from

1)属于DML
2)可回滚
3)可带where
4)表结构在,表内容要看where执行的情况
5)删除速度慢,需要逐行删除
不再需要一张表的时候,用drop
想删除部分数据行时候,用delete,并且带上where子句
保留表而删除所有数据的时候用truncate

7.数据库的乐观锁和悲观锁是什么?

数据库的乐观锁和悲观锁是什么?

确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性,乐观锁和悲观锁是并发控制主要采用的技术手段。

  • 悲观锁:假定会发生并发冲突,屏蔽一切可能违反数据完整性的操作

    在查询完数据的时候就把事务锁起来,直到提交事务
    实现方式:使用数据库中的锁机制

  • 乐观锁:假设不会发生并发冲突,只在提交操作时检查是否违反数据完整性。

    在修改数据的时候把事务锁起来,通过version的方式来进行锁定
    实现方式:使用version版本或者时间戳

8.工作中你有什么印象比较深的优化经历?

根据业务对联合索引进行巧妙调整。
慢查询中有个业务查询类似于
select uid from t where name like ‘林%’ and age =20
原索引是(name,age),通过执行计划分析,发现该索引的效率之所以不够高是因为回表次数太多,也就意味着索引树上满足条件的数据太多。一般来说,条件筛选到这么小范围是不应该出现这个情况的,索引的区分度并没有这么差。事实上,是因为对name字段使用了模糊匹配,导致的联合索引失效。数据库从该索引树上找到所有姓林的员工,然后直接回到主索引树上再对age字段进行判别。而我们需要的是在索引树上就对这两个字段做判断,这样就可以筛除掉大部分不满足条件的数据。于是在确定修改索引不会造成其他业务出问题后,我就对索引进行了调整,改成(age,name)联合索引,结合mysql的ICP功能,完美解决本次慢查询问题。

9.你觉得rc和rr哪个隔离级别的性能更好?

RC级别没有gap锁,更新数据时只会锁住对应索引上和主树上的记录,不会给范围加锁,从并发上来说,比RR性能要好。不过同一个事务内多次查询相同范围的数据,看到的结果可能不一样。
第一句话 rc没有gap 一般书上都是这么说的 其实在碰到唯一索引的时候 某些场景还是会有gap的, 问题本身,一般来说基本上rc性能好,因为可以近似认为没有gap,都是记录锁,但是有一种极端情况,一个事务里都是读,读都是快照嘛 一般不涉及锁 这时候rr只会在事务开启的时候创建一个read view,rc是每个读都会创建,这种情况下rr性能更好

你可能感兴趣的:(数据库开发面试问题汇总)