面试----数据库篇

159 阅读8分钟

如何定位慢查询

image.png

image.png

如何分析执行得很慢的sql

image.png

image.png

通过key和key_len来判断是否可能会命中索引,可以查询是否使用索引以及索引占用的大小

Extra用于分析索引的使用是否有优化空间,如果是using index condition则可以优化

image.png

type用于分析sql的连接类型,如果是index或all,就需要优化sql

回答总结

image.png

索引概念及底层数据结构

image.png

如果不使用索引,查询数据时需要全表扫描,即查到45时,还需要向后继续查询直到查完整个表

image.png

红黑树的每个节点只能有两个子节点,导致数据库的数据量很大时,红黑树会很高,查找性能变低

image.png

image.png

MySQL中索引的底层数据结构是B+树,B+树只在叶子节点存储数据,非叶子节点不存储数据,只提供指针以及一些用来导航的值,所以相对于B树从上到下查询时需要遍历很多非叶子节点的数据,B+树不用遍历非叶子节点的数据,从而读写代价更低

同时B+树的查找路径大体上是相同的(高度相同),因此查询更稳定

B+树的叶子节点之间是双向连接的,可以很好的进行扫库和区间查询,比如查询6~34,只需查到6就可以链式查询,而不必重新从上到下查询

image.png

聚簇索引和非聚簇索引

image.png

image.png

id为主键,所以主键索引就是聚集索引,在叶子节点中存储的是整行的数据

给name添加索引,则对应的是二级索引,在叶子节点中存储的是对应的主键

image.png

回表查询就是通过二级索引找到主键,在通过聚集索引找到对应的行数据

覆盖索引、超大分页优化

覆盖索引

image.png

覆盖索引就是能通过一次索引查询出结果,比如直接根据主键查询出结果/直接根据二级索引查询出二级索引叶子节点的数据,但如果要用到回表查询,就不是覆盖索引了

image.png

超大分页优化

image.png

image.png

通过使用覆盖索引+子查询一次性查询出按主键排序后的结果,优点:使用索引,性能提高,不用回表查询,性能提高,子查询关联查询,从而查询出原先所要的结果

image.png

索引创建的原则有哪些

image.png

索引失效

image.png

上面是索引正常命中的情况,联合索引必须按顺序查询,即遵循最左前缀法则,不跳过任何一个索引,如果跳过了某个索引,则explain出来的命中的索引只有跳过位置之前的索引,如下是索引失效的情况:

image.png

image.png

使用了范围查询的列的右边的列索引失效

image.png

索引进行运算操作后会失效

image.png

字符串必须加单引号,否则失效

image.png

模糊匹配有可能会失效

image.png

SQL优化的经验

image.png

image.png

事务的特性

image.png

并发事务问题、隔离级别

并发事务问题

image.png

image.png

image.png

image.png

隔离级别

image.png

x代表可以解决,√代表不可解决,从上到下级别越高,数据越安全,性能越低,其中串行化与并发相悖,因此正常是不用的,默认应该使用可重复读

image.png

image.png

可重复读隔离级别下,A事务提交的数据,在B事务能看见吗,又为什么会出现幻读,如何解决

image.png

image.png

image.png

串行化隔离级别是通过什么实现的

image.png

undo log和redo log的区别

image.png

当用户执行sql语句并提交事务,首先会去操作内存中的缓冲池(性能比操作磁盘高,磁盘需要io),而磁盘中存储的是数据页(默认16KB,其中存储了表的每一行数据,有时候表足够大,大到需要多个数据页进行存储),在真正操作缓冲池之前会将磁盘中的数据页加载到内存中,操作完成后会按一定频率将数据页同步到磁盘中

存在问题:当操作完内存缓冲池中的数据页后,如果主机突然宕机,则数据页丢失,从而失去了持久化特性

image.png

使用redo log解决,就是多了一个人来记录数据变化到日志文件中,一旦宕机,就根据日志文件进行恢复,redo log实际上就是持久化,体现持久性

image.png

undo log实际上就是回滚,体现原子性和一致性

image.png

解释一下MVCC

如何保证事务的隔离性

1、使用排他锁:如一个事务获取了一个数据行的排他锁,其他事务就不能再获取该行的其他锁

2、mvcc:多版本并发控制

MVCC实现原理

image.png

image.png

image.png

image.png

一条update是不是原子性的?为什么

image.png

MySQL的主从同步原理

image.png

其实就是主库执行ddl、dml之后会有一个binlog日志,从库会开启一个IOThread去读取这个日志,写入到自己的中继日志Relay Log之中,然后由另外一个SQLThread线程重做ddl、dml操作,实现从库的数据与主库一致

MySQL分库分表

image.png

image.png

image.png

image.png

垂直分表就是按照字段来分表,冷热数据分离(不常用和常用的字段分离)、大小字段分离(如例子中的description)

image.png

水平分库不同于垂直分库,垂直分库是按照业务划分数据,而水平分库是直接划分数据,不同的数据库有一定的数据量,比如第一个数据库100w条记录,第二个数据库100w条记录... 所以可以根据id范围来找到想要的数据,或者采用id取模等方法

image.png

水平分表类似于水平分库,只不过以表为单位划分数据为多个表,既然是划分表,那么划分出来的多个表既能拆分到多个库中也可以拆分到单个库中

分库分表产生的问题

image.png

  • 分布式事务一致性:由于分了多个库,每个库又维护各自的事务,如果一个库事务提交失败,另一个库事务提交成功,则可能出现事务不一致的情况
  • 跨节点关联查询、分页、排序函数:例如垂直分库根据业务把不同的表拆分到不同的库中,那么如果两个表需要关联查询,又该如何操作?同样,分页和排序函数又该如何操作?
  • 主键避重:例如水平分表,把一个表的数据划分到多个库中,而各个库又各自维护表的主键,都各自从id为1开始,则会出现主键重复的问题

如何解决

image.png

使用中间件

SQL查询语句的执行顺序

image.png

执行一条SQL请求的过程是什么

image.png

讲一讲mysql的引擎吧,你有什么了解

image.png

MySQL为什么InnoDB是默认引擎

image.png

说一下mysql的innodb与MyISAM的区别

image.png

数据管理里,数据文件大体分成哪几种数据文件

image.png

讲讲索引的分类是什么

image.png

image.png

image.png

image.png

image.png

image.png

MySQL聚簇索引和非聚簇索引的区别是什么

image.png

如果聚簇索引的数据更新,它的存储要不要变化

image.png

MySQL主键是聚簇索引吗

image.png

什么字段适合当做主键

image.png

表中十个字段,你主键用自增ID还是UUID,为什么

image.png

为什么自增ID更快一些,UUID不快吗,它在B+树里面存储是有序的吗

image.png

查询数据时,到了B+树的叶子节点,之后的查找数据是如何做

image.png

B+树的特性是什么

image.png

说说B+树和B树的区别

image.png

B+树的好处是什么

image.png

B+树的叶子节点链表是单向还是双向

image.png

MySQL为什么用B+树结构?和其他结构比的优点

image.png

为什么 MysSQL 不用 跳表

image.png

联合索引的实现原理

image.png

image.png

image.png

创建联合索引时需要注意什么

image.png

判断索引是否生效

image.png

image.png

如果一个列既是单列索引,又是联合索引,单独查它的话先走哪个

image.png

索引已经建好了,那我再插入一条数据,索引会有哪些变化

image.png

索引的优缺点

image.png

索引优化

image.png

事务是如何实现的

image.png

哪些场景不适合脏读,举个例子

image.png

mysql的是怎么解决并发问题的

image.png

讲一下mysql里有哪些锁

image.png

数据库的表锁和行锁有什么作用

image.png

MySQL两个线程的update语句同时处理一条数据,会不会有阻塞

image.png

两条update语句处理一张表的不同的主键范围的记录,一个<10,一个>15,会不会遇到阻塞,底层是为什么

image.png

如果2个范围不是主键或索引?还会阻塞吗

image.png

日志文件是分成了哪几种

image.png

讲一下binlog

image.png

有了undolog为啥还需要redolog呢

image.png

image.png

redo log怎么保证持久性的

image.png

能不能只用binlog不用redo log

image.png

update语句的具体执行过程是怎样的

image.png

mysql的explain有什么作用

image.png

image.png

给你张表,发现查询速度很慢,你有哪些解决方案

image.png

如果Explain用到的索引不正确的话,有什么办法干预吗

image.png

MySQL主从复制了解吗

image.png

主从延迟都有什么处理方法

强制走主库方案:对于大事务或资源密集型操作,直接在主库上执行,避免从库的额外延迟。

分表和分库是什么?有什么区别

image.png

image.png