MySQL⾼频⾯试题-划重点、敲难点MySQL⾼频⾯试题
MySQL的体系结构?
InnoDB的体系结构?
可先谈谈MySQL的体系结构,再从以下三个⽅⾯介绍InnoDB体系结构:
内存
包含:insert_buffer、data_buffer、index_buffer、redo_log_buffer、double_write
刷新到磁盘的机制:redo log buffer、脏页、binlog catch
线程
master_thread、purgr_thread、redo log thread、read thread、write thread、page cleaner thread 磁盘
存放数据的⽂件:redo log、undo log、binlog
MySQL主要存储引擎MyISAM与InnoDB的区别?
事务:InnoDB⽀持事务,MyISAM不⽀持
锁⼒度:InnoDB⾏锁,MyISAM表锁
存储空间:InnoDB既缓存索引⽂件,⼜缓存数据⽂件,MyISAM只缓存索引⽂件
存储结构:InnoDB所有表都保存在同⼀个数据⽂件⾥,MyISAM数据⽂件扩展名为.MYD myData,索引⽂件的扩展名是.MYI myIndex
统计记录⾏数:select count(*) InnoDB便利全表,MyISAM保存有表的总⾏数,可直接取值使⽤
MySQL两阶段提交过程?
准备提交(transaction prepare):事务SQL语句先写⼊redo log buffer,然后做⼀个事务准备标记,再将log buffer中的数据刷新到redo log
提交阶段(commit):将事务产⽣的binlog写⼊⽂件,刷⼊磁盘
InnoDB的三⼤特性?
插⼊缓存(change buffer)
作⽤:把普通索引上的DML操作从随机I/O变成顺序I/O,提⾼I/O效率
原理:判断插⼊的普通索引是否在缓冲池中,在则直接插⼊,不在则先放到change buffer中,然后进
⾏change buffer和普通索引的合并操作,将多个插⼊合并到⼀个操作中,提⾼普通索引的插⼊性能
两次写(double write)
作⽤:保证数据写⼊安全,防⽌在MySQL实例发⽣宕机时,发⽣数据页部分页写(partial page write)的问题。
⾃适应哈希索引(adaptive hash index)
MySQL有哪些索引类型?
数据结构⾓度:B+tree索引、hash索引、fulltext索引
存储⾓度:聚簇索引和⾮聚簇索引
逻辑⾓度:primary key、normal key、单例、复合和覆盖索引
为什么MySQL默认⽂件16K?
假设⼀⾏数据⼤⼩为1K,那么⼀页就能存16条数据,即⼀个叶⼦节点能存16条数据;
对于⾮叶⼦节点,假设ID为bigint类型,则长度为8B,指针⼤⼩在InnoDB源码中为6B,共14B,那么⼀页就可以存储
16KB/14B=1170个(主键+指针)。
⼀颗⾼度为2的B+树能存储的数据为:1170*16=18720条(万级数据)
⼀颗⾼度为3的B+树能存储的数据为:1170*1170*16=21902400条(千万级数据)
表中只有⼀个字段 VARCHAR(N)类型,utf8 编码,则 N 最⼤值?
由于 utf8 的每个字符最多占⽤ 3 个字节。⽽ MySQL 定义⾏的长度不能超过65535,因此 N 的最⼤值计算⽅法为:(65535-1-2)/3。
减去 1 的原因是实际存储从第⼆个字节开始,
减去 2 的原因是因为要在列表长度存储实际的字符长度,
除以 3 是因为 utf8 限制:每个字符最多占⽤ 3 个字节。
⾃增表有id 从1到5的5条数据,删除最后两条数据(id为4和5)后重启MySQL服务器,⼜新增⼀条数
据,问新增数据的id?
如果表为 MyISAM 引擎,那么 id 就是 6
如果是 InnoDB 引擎,在 MySQL 8.0之前, id 就是 4, 8.0之后 InnoDB 会把索引持久化到⽇志中,重启服务之后⾃增索引是不会丢失的,即 id 为 6
MySQL ⽂件?
参数⽂件
错误⽇志⽂件(error log)
⼆进制⽇志⽂件(binary log)
慢查询⽇志⽂件(slow log)
全量⽇志⽂件(general log)
中继⽇志⽂件(relay log)
Pid⽂件:单进程多线程DB会将⾃⼰唯⼀的进程号记录到Pid⽂件中
Socker⽂件:⽹络连接和本地连接两种连接⽅式
表结构⽂件
InnoDB存储引擎⽂件:redo和undo两种⽇志⽂件
MySQL binlog有⼏种格式?
statement格式,⽣产环境不建议使⽤
优点:不需要记录每⼀⾏的变化,减少了binlog⽇志量,节约I/O,提⾼性能
缺点:使⽤特殊函数或跨库操作时容易丢失数据
row格式,⽣产环境建议使⽤
优点:记录每⾏数据信息,安全性⾼
缺点:会产⽣⼤量binlog,⽹络开销也较⼤
mixed格式,⽣产环境不建议使⽤
MySQL5.1的⼀个过渡版本,DDL语句会记录成statement,DML会记录成row
undo log和redo log是什么?作⽤?
undo log和redo log是mysql中InnoDB存储引擎的基本组成
undo log保存了事务执⾏前数据的值,以便于事务回滚时能回到事务执⾏前的数据版本,多次更 新会有undo log的版本链
redo log在物理层⾯上记录了事务操作的⼀系列信息,保证就算遇到mysql宕机等因素还没来得 及将数据刷到磁盘⾥,通过redo log 也能恢复事务提交的数据。
redo log怎样保证事务不丢失的?
当⼀个事务提交成功后,虽然缓冲池中的数据不⼀定来得及⻢上落地到磁盘中,但是redo log记录的 事务信息持久化到磁盘中了、且含有commit标记,此时如果mysql宕机导致缓冲池中的、已经被事务更新 过的内存数据丢失了,此时在mysql重启时,将磁盘中的redo log中将事务变更信息给加载到缓冲池中, 保证事务信息不会丢失。或者redo log刷盘了,binlog写成功了,在重启时会⾃动给上commit标记,在重放数据。
事务是先提交还是先刷盘?
事务先提交后刷盘html表单与数据库连接
mysql面试题基础知识Redo log刷盘成功
js混淆反编译Binlog刷盘
BinLog名称和⽂件路径信息、commit标志写到Redo log 中,事务两阶段提交的⽅式来保证。
更新操作为什么不直接更新磁盘反⽽设计这样⼀个复杂的InnoDB存储引擎来完成?
直接更新磁盘是随机IO写,存在磁盘地址寻址操作,性能⾮常低,承载不了⾼并发场景; ⽽转换为InnoDB中,内存⾼速读写、redo log和undo log顺序写磁盘性能相对于随机IO写性能会⾼的多,⽽这种性能上的提⾼⾜以抵消这种架构上带来的复杂,可在⼀定QPS内承载⾼并发场景。
mysql ⽀持的复制类型?
基于语句的复制: 在主服务器上执⾏的 SQL 语句,在从服务器上执⾏同样的语句。MySQL 默认采⽤基于语句的复制,效率⽐较⾼基于⾏的复制:把改变的内容复制过去,⽽不是把命令在从服务器上执⾏⼀遍。从 mysql5.0 开始⽀持
混合类型的复制: 默认采⽤基于语句的复制,⼀旦发现⽆法精确的复制时,就会采⽤基于⾏的复制
MySQL主从复制的原理?
主服务器把数据更新记录到⼆进制⽇志中,从服务器通过I/O thread,向主库发起binlog请求,主服务器通过I/O dump thread 把⼆进制⽇志传递给从库,从库通过I/O thread 记录到⾃⼰的中继⽇志中。然后通过SQL thread应⽤中继⽇志SQL的内容
MySQL主从延迟的原理?
MySQL 5.7之前,主库可以并发写⼊,但从库只能通过单SQL thread完成任务,这是出现主从延迟的核⼼原因
MySQL主从同步并不是实时同步,⽽是异步的同步,既主库提交事务后,从库才再执⾏
主库上对没有索引⼤表的列进⾏delete或update操作
从库的硬件配置没有主库的好
⽹络抖动导致I/O线程复制延迟
如何监控主从延迟?
传统⽅法:通过⽐较主从服务器之间的position号的差异值;通过查看seconds_behind_master估算主从延迟时间
使⽤第三⽅⼯具:percona-toolkit中的pt-heartbeat命令
如何解决主从延迟问题?
使⽤MySQL 5.7的基于组提交的并⾏复制功能
采⽤PXC架构,可实现多节点写⼊,达到实时同步
业务规划初期选择合适的分库分表策略,避免单表或单库过⼤,造成复制压⼒
避免⽆⽤I/O消耗,增加⾼转速的磁盘、SSD或PCIE-SSD设备
阵列级别选择RAID 10,raid cache策略采⽤WB
I/O调度选择deadline模式
适当调整buffer pool的⼤⼩
避免让数据库进⾏⼤量运算
数据库只是⽤来存储数据的
数据库中的双⼀是什么?
sync_binlog=1
innode_flush_log_at_trx_commit=1
这两个参数控制MySQL磁盘写⼊策略和数据安全性的
innode_flush_log_at_trx_commit设置为1,每次事务提交时都会把log buffer的数据写⼊log file并刷到磁盘中
sync_binlog=N(N>0),在每写N次⼆进制⽇志binary log时,会使⽤fdatasync()函数将其写⼊⼆进制⽇志binary log同步到磁盘
为什么要为InnoDB表设置⾃增列做主键?
使⽤⾃增列做主键,写⼊顺序是⾃增的,和B+树叶⼦节点分裂顺序⼀致。
InnoDB表的数据写⼊顺序能和B+树索引的叶⼦节点顺序⼀致时,存储效率是最⾼的。如何优化⼀条如何把svg转成jpg
慢SQL语句?
专业的笑⼀来就加索引的,加索引的笑不懂的
回归表的设计层⾯,数据类型选择是否合理
⼤表碎⽚的整理是否完善
表的统计信息是不是准确的
审查表的执⾏计划,判断字段上有⽆合适的索引
针对索引的选择性,建⽴合适的索引
服务器负载过⾼或⽹页打开缓慢的优化思路?
⾸先发现问题,通过以下四个维度到问题所在
操作系统
数据库
程序设计
硬件
其次制定优化⽅案;
再在测试环境进⾏优化⽅案的测试并记录;
最后通过测试结果分析,到最好的解决⽅案并实施
什么是死锁?锁等待?通过数据库哪些表可以监控?
死锁是指两个或多个事务在同⼀资源上互相占⽤,并请求加锁时导致的恶性循环想象。当多个事务以不同顺序试图加锁同⼀资源时,就会产⽣死锁。
锁等待:MySQL数据库中,不同session在更新同⾏数据时会出现锁等待现象。
重要的三张锁的监控表:innodb_trx、innodb_locks和innodb_lock_waits
处理过MySQL的哪些案例?
可从MySQL的五⼤知识模块出发:
体系结构
数据的备份恢复
复制
⾼可⽤集架构
优化
例如:
正余弦公式大全MySQL版本的升级免费制作简历的网站
处理集架构中的各种“坑”和问题
根据业务合理设计库、表和后期架构
定期进⾏灾备恢复演练
恢复误删除的数据信息
接触过哪些MySQL的主流架构?
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论