数据库面试题

一、MySQL

1、MySQL数据存储引擎

1.1 InnoDB
1.1.1 总体介绍

默认引擎,也是首选引擎,是事务型数据库的默认引擎

支持事务(ACID) 、行锁定、外键

InnoDB处理巨大数据性能高

1.1.2 InnoDB自适应hash索引

InnoDB在简历索引的时候,只简历B+tree索引,不会简历hash索引。

但是hash索引也有自己特点,在等值查询的时候效率更高, InnoDB会自动创建hash索引。

当InnoDB认为连续3次被访问的非聚集索引 是 热点数据,就给这个热点数据 自动创建hash索引。

1.2 MyISAM

MyISAM 不支持事务,没有ACID

不支持行级锁、支持表级锁

不支持外键

批量插入快

内存消耗相对少

1.3 InnoDB 与MyISAM的区别
外键:innodb支持  myisam不支持
锁:innodb行级锁,myisam表级锁
事物:innodb支持,myisam不支持
查询添加速度:myiasm比innodb插入快
内存使用:mysiam比innodb空间使用率低
1.3 Memory

数据都存储在内存中,不需要磁盘IO,速度很快;但是重启后,表结构会保留,数据会丢失,不能持久化数据。

1.4 CSV

CSV引擎是将普通的CSV文件作为MySQL的表来处理, 不支持索引

2、B树 B+树

2.1 什么是B树

2.2 什么是B+树

只需要说出B+树几个特点。

① 中间节点不存数据,数据都存到叶子节点

②叶子节点由链表组成,且前后相连,形成 环形链表

③ 中间节点存储子节点的 最大值或最小值。

2.3 B+树比B树更适合数据库索引

文件或数据库存储的数据都很大,不能都放入到内存中,必须在磁盘中进行读写,则索引应该尽可能少对磁盘进行IO操作。

B+树相比B树更矮,查询IO次数更少。

B+树查询都是查到叶子节点,查询更稳定。

B+树方便扫库(遍历),B+树直接从子节点挨个扫一遍就可以,支持range-query非常方便。

2.4 主键 是是有自增ID还是UUID

对于InnoDB的主索引,数据会安装主键进行排列,由于UUID是无序的,会产生很大IO压力,因此UUID不适合做物理主键,物理主键使用自增ID,可以把UUID作为逻辑主键。

在实际开发中 如果历史数据表与 当前数据表进行合表操作,两个表都是自增id做主键,如果合并,id会造成冲突,这个时候使用UUID做id的值,则id是相互独立的,不会存在数据表合并的问题。

3、脏页

数据页是数据文件中的最小存储单元,页面的大小是8*1024个字节,页面含有一个96字节长度的头部,所以,每个页面只能保存8096个字节的数据

3.1 什么是脏页

当内存数据页和磁盘中数据页(数据库中数据页) 内容不一致的时候,我们称内存页为 脏页。

内容一致的时候,成为干净页。

更新的操作,都写到内存、日志中,不会马上同步到磁盘数据,这个时候内存数据页就是脏页。

一条SQL语句 正常快,有时候慢,这个慢的时候 可能就是讲脏页同步到磁盘上。

3.2 脏页同步

什么时候做脏页同步:

redo log写满了,停止更新,需要讲更新的部分日志对应的脏页同步到磁盘。

当系统内存不足时,淘汰部分数据页,如果是脏页,则先更新脏页。

mysql正常关闭时,会把内存脏页都同步到磁盘上。

4、数据库索引

聚集(clustered)索引,也叫聚簇索引。

数据行的物理顺序与列值(一般是主键的那一列)的逻辑顺序相同,一个表中只能拥有一个聚集索引。

MySQL里主键就是聚集索引3

该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同,一个表中可以拥有多个非聚集索引。

5、数据库事务

事物:

​ 一组原子性的sql查询,是一个独立的工作单元,要么全部执行,要么全部不执行

bin-log

​ 记录数据库变化情况,可以对数据进行复制和备份,常常用作主从库同步

mysql事物日志:

​ redo log 重做日志提供前滚操作,是innoDB引擎层日志,记录事物操作引起的数据变化,记录的是数据页物理层修改

​ undo log 回滚日志提供回滚操作,是innoDB引擎层日志,作用对数据进行回滚

事物四大特性:

​ 原子性 一致性 隔离性 持久性

事物并发可能出现的三种问题:

​ 脏读

​ 幻读

​ 不可重复读

mysl事物的隔离级别:

​ 读未提交:就是一个事务可以读取另一个未提交事务的数据

​ 提交不成功带来脏读,成功带来幻读和不可重复读

​ 读已提交:就是一个事务要等另一个事务提交后才能读取数据。

​ 避免了脏读,但是还会有幻读和不可重复读

​ 可重复读:所有被 Select 获取的数据都不能被修改,这样就可以避免一个事务前后读取数据不一致的情况。

​ 避免了脏读和不可重复读,但是有幻读

​ 可串行化:是最高的事务隔离级别,在该级别下,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。

6、数据库锁

事物并发的时候数据不一致,比如库存超卖,所以通过锁来保证访问次序

力度划分:行级锁,表级锁,页级锁

对表test_table增加读锁:

LOCK TABLES test_table READ

UNLOCK test_table

对表test_table增加写锁

LOCK TABLES test_table WRITE

UNLOCK test_table

死锁的原因:

​ 两个事物都持有对方需要的锁,都在等待对方释放锁,并且都不会释放自己的锁

避免死锁:

​ 不同程序并发存取多个表,建议以相同的顺序访问表

​ 同一个事物中,尽量一次锁定所需要的全部资源

​ 容易产生死锁的业务部分,升级锁的粒度,通过表级锁减少死锁概率

innoDB如何对待死锁:

​ 发起死锁检测,主动回滚一条事务,让其他事物继续执行

优化锁:

​ 减少锁持有时间

​ 减少锁粒度,少用表锁,缩小锁定范围

​ 读写分离锁替换独占锁

7、mysql优化

8、mysql主从操作

9、常见SQL语句

二、Redis

1、Redis

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值