MySQL 数据库面试题及知识梳理
  IE5LYMWlmdvL 2023年12月05日 13 0

MYSQL 的同步方式有哪些

mysql 主从同步三种模式:异步复制、半同步复制、全同步复制、无损复制


对MYSQL的MVCC的理解

MVCC 只在 COMMITTED READ(读提交)和REPEATABLE READ(可重复读)两种隔离级别下工作。


另一种是数据多版本并发控制(MultiVersion Concurrency Control,简称 MVCC 或 MCC),也称为多版本数据库:

不用加任何锁, 通过一定机制生成一个数据请求时间点的一致性数据快照 (Snapshot),

并用这个快照来提供一定级别 (语句级或事务级) 的一致性读取。从用户的角度来看,好象是数据库可以提供同一数据的多个版本。

MVCC 实现原理如下:

MVCC 的实现依赖于版本链,版本链是通过表的三个隐藏字段实现。

  • DB_TRX_ID:当前事务id,通过事务id的大小判断事务的时间顺序。
  • DB_ROLL_PRT:回滚指针,指向当前行记录的上一个版本,通过这个指针将数据的多个版本连接在一起构成undo log版本链。
  • DB_ROLL_ID:主键,如果数据表没有主键,InnoDB会自动生成主键。


MySQL的默认事务隔离级别

重复读


MySQL 内存结构

从 innodb 的整体架构中可以知道 innodb 的内存架构中分为

buffer pool 缓存区,

change pool 修改缓冲区,

adaptive hash index 自适应哈希索引,  索引的索引

我们都知道,Hash数据结构都是包含键(Key)、值(Value)的,在Adaptive Hash Index,Key就是经常访问到的索引键值,Value就是该索引键值匹配的完整记录所在页面(Page)的位置。

和 log buffer 日志缓冲区.

MySQL 数据库面试题及知识梳理_面试

MySQL锁

乐观锁并不会使用数据库提供的锁机制。一般的实现乐观锁的方式就是记录数据版本


MySQL binlog的几种日志录入格式以及区别

row statement


数据库cpu飙升到500%的话他怎么处理


当 cpu 飙升到 500%时,先用操作系统命令 top 命令观察是不是 mysqld 占用导致的,如果不是,找出占用高的进程,并进行相关处理。

如果是 mysqld 造成的, show processlist,看看里面跑的 session 情况,是不是有消耗资源的 sql 在运行。找出消耗高的 sql,看看执行计划是否准确, index 是否缺失,或者实在是数据量太大造成。

一般来说,肯定要 kill 掉这些线程(同时观察 cpu 使用率是否下降),等进行相应的调整(比如说加索引、改 sql、改内存参数)之后,再重新跑这些 SQL。

也有可能是每个 sql 消耗资源并不多,但是突然之间,有大量的 session 连进来导致 cpu 飙升,这种情况就需要跟应用一起来分析为何连接数会激增,再做出相应的调整,比如说限制连接数等。


sql 的执行过程,在数据库中经过哪些步骤

连接器-分析器(查询缓存)- 优化器 - 执行器 - 存储引擎


double write的工作机制

Double write 是InnoDB在 tablespace上的128个页(2个区)是2MB;

其原理:

   为了解决 partial page write 问题 ,当mysql将脏数据flush到data file的时候,

先使用memcopy 将脏数据复制到内存中的double write buffer ,之后通过double write buffer再分2次,每次写入1MB到共享表空间,

然后马上调用fsync函数,同步到磁盘上,避免缓冲带来的问题,在这个过程中,doublewrite是顺序写,开销并不大,

在完成doublewrite写入后,在将double write buffer写入各表空间文件,这时是离散写入。

如果发生了极端情况(断电),InnoDB再次启动后,发现了一个Page数据已经损坏,那么此时就可以从doublewrite buffer中进行数据恢复了。


双一的意义

innodb_flush_log_at_trx_commit=1

每次事务提交时MySQL都会把log buffer的数据写入log file,并且flush(刷到磁盘)中去


sync_binlog=1

MySQL 在每写 1次 binary log时,会使用fdatasync()函数将它的写二进制日志binary log同步到磁盘中去


保证了数据的安全性



mysqld启动时做了以下功能

处理配置文件及启动参数

日志系统初始化

初始化很多系统内部变量

信号系统初始化

核心模块启动,包括存储引擎等

终端重定向处理

网络系统初始化

状态变量初始化

Binlog相关检查初始化

服务监听线程创建


mysql整体的执行过程如下图所示


聚簇索引、覆盖索引

Q:刚刚我们聊到B+ Tree ,那你知道B+ Tree的叶子节点都可以存哪些东西吗?


A:InnoDB的B+ Tree可能存储的是整行数据,也有可能是主键的值


Q:那这两者有什么区别吗?


A:(当他问我叶子节点的时候,其实我就猜到他可能要问我聚簇索引和非聚簇索引了)在 InnoDB 里,索引B+ Tree的叶子节点存储了整行数据的是主键索引,也被称之为聚簇索引。而索引B+ Tree的叶子节点存储了主键的值的是非主键索引,也被称之为非聚簇索引


Q:那么,聚簇索引和非聚簇索引,在查询数据的时候有区别吗?


A:聚簇索引查询会更快?


Q:为什么呢?


A:因为主键索引树的叶子节点直接就是我们要查询的整行数据了。而非主键索引的叶子节点是主键的值,查到主键的值以后,还需要再通过主键的值再进行一次查询


Q:刚刚你提到主键索引查询只会查一次,而非主键索引需要回表查询多次。(后来我才知道,原来这个过程叫做回表)是所有情况都是这样的吗?非主键索引一定会查询多次吗?



B-Tree 和 B+Tree 的区别

所有数据记录节点都是按照键值大小顺序存放在同一层的叶子节点上


MySQL 索引性能排行

性能排名:system > const > eq_ref > ref > range > index > all。


ALL(全表扫描);


index(全索引扫描);


range(索引范围扫描);


ref(非唯一索引扫描);


eq_ref(唯一索引扫描);


const(结果只有一条的主键或唯一索引扫描)。


事务的四大特性

事务特性ACID:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。


原子性 是指事务包含的所有操作要么全部成功,要么全部失败回滚。

一致性 是指一个事务执行之前和执行之后都必须处于一致性状态。比如a与b账户共有1000块,两人之间转账之后无论成功还是失败,它们的账户总和还是1000。

隔离性 跟隔离级别相关,如read committed,一个事务只能读到已经提交的修改。

持久性 是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。


慢SQL

Splunk 日志分析软件   pt-query-digest


pt-online-schema-change 快速更改表结构


mysql mysqlrouter、proxysql


MHA GTID 空洞

【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月05日 0

暂无评论

推荐阅读
IE5LYMWlmdvL
最新推荐 更多

2024-05-17