数据库常见面试题汇总

1.当数据增加到100万以上,MySQL的性能急剧下降
如何对其进行优化?
答:主从同步复制
M-M-Slaves方式:2个主Mysql,多个Slaves.Slaves可进一步负载均衡,可结合LVS,从而将select操作适当的平衡到不同的slaves上。
但是:如果数据超过一千万,不能随意扩充Slaves,因此进行表分区,将其切分到不同的数据库集群会。

2.既然提到了集群,那你说一下集群软件的分类吧?
答:(1)高性能集群(HPC):利用一个集群中的多台机器共同完成同一件任务,使得完成任务的速度和可靠性都远远高于单机运行的效果。
(2)负载均衡集群(LBC)
(3)高可用性集群(HAC)

3.说一说数据库的四大范式?
回答此问题的时候先回答四大范式的概念,然后结合面试官给的场景题作答。

4.说一说数据库的隔离级别以及mysql默认的隔离级别和orcale默认的隔离级别?
答: 01: Read uncommitted(读未提交):最低级别,任何情况都会发生。
02:Read Committed(读已提交): 可避免脏读的发生。
03:Repeatable read(可重复读): 可避免脏读、不可重复读的发生。
04:Serializable(串行化): 避免脏读、不可重复读,幻读的发生。
在MySQL数据库中,支持上面四种隔离级别,默认的为Repeatable read (可重复读);缺点:引起幻读
而在Oracle数据库中,只支持Serializable (串行化)级别和Read committed (读已提交)这两种级别,其中默认的为Read committed级别。

5.索引的创建原则,给定一个情况,问此情况下能创建索引吗?
6.为什么创建索引了查询就会快?
B+树:在B+树中叶子节点存放数据,非叶子节点存放键值和指针,索引组织通过非叶子节点的二分查找以及指针确定数据在哪个页中,进而再去数据页中查找到需要的数据。
即:通过B+树来查找,首先找到根页,每张表的根页位置在 表空间文件中是固定的,找到根页后通过二分查找法,定位到页中,在进一步去页中查找

7.再问:为什么MySQL的索引要使用B+树而不是B树
因为B树不管叶子节点还是非叶子节点都会保存数据,导致在非叶子节点中能保存的指针数量变少,指针少的情况下要保存大量数据只能增加树的高度,导致IO操作变多,查询性能低。

8.说一说Mysql的两种存储引擎Innodb和MyISAM区别?
Innodb引擎提供了对数据库ACID事务的支持,提供了行级锁和外键约束,MySQL运行时Innodb会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎不支持FULLTEXT类型的索引,而且它没有保存表的行数,当SELECT COUNT() FROM TABLE时需要扫描全表。
MyISAM是MySQL默认的引擎,但是它没有提供对数据库事务的支持,也不支持行级锁和外键,因此当INSERT(插入)或UPDATE(更新)数据时即写操作需要锁定整个表,效率便会低一些。不过和Innodb不同,MyIASM中存储了表的行数,于是SELECT COUNT(
) FROM TABLE时只需要直接读取已经保存好的值而不需要进行全表扫描。
区别:
(1)、MyISAM是非事务安全的,而InnoDB是事务安全的
(2)、MyISAM锁的粒度是表级的,而InnoDB支持行级锁
(3)、MyISAM支持全文类型索引,而InnoDB不支持全文索引
(4)、MyISAM相对简单,效率上要优于InnoDB,小型应用可以考虑使用MyISAM
(5)、MyISAM表保存成文件形式,跨平台使用更加方便
运用场景:
InnoDB用于事务处理,具有ACID事务支持等特性,如果在应用中执行大量insert和update操作,应该选择InnoDB
MyISAM管理非事务表,提供高速存储和检索以及全文搜索能力,如果再应用中执行大量select操作,应该选择MyISAM

注:回答此问题,尽量回答全面

9.看你项目中使用了Redis来减轻数据库的压力,谈一谈为什么它能减轻数据库的压力以及它数据类型?(必问)
回答完数据类型,会接着问:你用的哪一个?
我自己用的是zset
接着问:为什么会选择用zset,zset的底层存储结构?
此时就 引出了压缩表和跳表,推荐可以把结构图画出来。

10.为什么主键自增?
把防止页分裂详细讲一讲就好了。

11.Mysql会最大程度的使用缓存机制来提高数据库的访问效率,但是万一数据库发生断电,因为缓存的数据没有写入磁盘,导致缓存在内存中的数据丢失而导致数据不一致怎么办?
答:回答往事务日志上靠
Innodb主要是通过事务日志实现ACID特性
事务日志包括:重做日志redo和回滚日志undo
Redo记录的是已经全部完成的事务,就是执行了commit的事务,记录文件是ib_logfile0 ib_logfile1
Undo记录的是已部分完成并且写入硬盘的未完成的事务,默认情况下回滚日志是记录下表空间中的(共享表空间或者独享表空间)
一般情况下,mysql在崩溃之后,重启服务,innodb通过回滚日志undo将所有已完成并写入磁盘的未完成事务进行rollback,然后redo中的事务全部重新执行一遍即可恢复数据,但是随着redo的量增加,每次从redo的第一条开始恢复就会浪费长的时间,所以引入了checkpoint机制
在此说一下脏页:一般业务运行过程中,当业务需要对某张的某行数据进行修改的时候,innodb会先将该数据从磁盘读取到缓存中去,然后在缓存中对这条数据进行修改,这样缓存中的数据就和磁盘的数据不一致了,这个时候缓存中的数据就称为dirty page,只有当脏页统一刷新到磁盘中才会是clean page
Checkpoint:如果在某个时间点,脏页的数据被刷新到了磁盘,系统就把这个刷新的时间点记录到redo log的结尾位置,在进行恢复数据的时候,checkpoint时间点之前的数据就不需要进行恢复了,可以缩短时间。

回答的时候这一方面可以自己扩。

12.说一说union和unionAll的区别

13.解释一下左连接和右连接

14.说一下drop,truncate,delete的区别

15.如何优化数据库

16.写sql语句(必有)

以上就是面试被问到的数据库方面的问题(还有些问题想不起来了),有需要的伙伴们可以看一看。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值