文章目录
31、如何理解 MySQL 的边读边发
-
如果客户端接受慢,会导致 MySQL 服务端由于结果发不出去,这个事务的执行时间会很长。
-
服务端并不需要保存一个完整的结果集,取数据和发数据的流程都是通过一个 next_buffer 来操作的。
-
内存的数据页都是在 Buffer_Pool中操作的。
-
InnoDB 管理 Buffer_Pool 使用的是改进的 LRU 算法,使用链表实现,实现上,按照 5:3 的比例把整个 LRU 链表分成了 young 区域和 old 区域。
32、MySQL 的大表查询为什么不会爆内存?
-
由于 MySQL 是边读变发,因此对于数据量很大的查询结果来说,不会再 server 端保存完整的结果集,所以,如果客户端读结果不及时,会堵住 MySQL 的查询过程,但是不会把内存打爆。
-
InnoDB 引擎内部,由于有淘汰策略,InnoDB 管理 Buffer_Pool 使用的是改进的 LRU 算法,使用链表实现,实现上,按照 5:3 的比例把整个 LRU 链表分成了 young 区域和 old 区域。对冷数据的全扫描,影响也能做到可控制。
33、MySQL 临时表的用法和特性
-
只对当前session可见。
-
可以与普通表重名。
-
增删改查用的是临时表。
-
show tables 不显示普通表。
-
在实际应用中,临时表一般用于处理比较复杂的计算逻辑。
-
由于临时表是每个线程自己可见的,所以不需要考虑多个线程执行同一个处理时临时表的重名问题,在线程退出的时候,临时表会自动删除。
34、MySQL 存储引擎介绍(InnoDB、MyISAM、MEMORY)
-
InnoDB 是事务型数据库的首选引擎,支持事务安全表 (ACID),支持行锁定和外键。MySQL5.5.5 之后,InnoDB 作为默认存储引擎
-
MyISAM 基于 ISAM 的存储引擎,并对其进行扩展。它是在 Web、数据存储和其他应用环境下最常用的存储引擎之一。MyISAM 拥有较高的插入、查询速度,但不支持事务。在 MySQL5.5.5 之前的版本中,MyISAM 是默认存储引擎
-
MEMORY 存储引擎将表中的数据存储到内存中,为查询和引用其他表数据提供快速访问。
35、都说 InnoDB 好,那还要不要使用 MEMORY 引擎?
-
内存表就是使用 memory 引擎创建的表
-
为什么我不建议你在生产环境上使用内存表。这里的原因主要包括两个方面:锁粒度问题;数据持久化问题。
-
由于重启会丢数据,如果一个备库重启,会导致主备同步线程停止;如果主库跟这个备库是双 M 架构,还可能导致主库的内存表数据被删掉。
36、如果数据库误操作, 如何执行数据恢复
数据库在某个时候误操作,就可以找到距离误操作最近的时间节点的bin log,重放到临时数据库里,然后选择误删的数据节点,恢复到线上数据库。
主从备份相关
37、MySQL 是如何保证主备同步?
主备关系的建立:
-
一开始创建主备关系的时候,是由备库指定的,比如基于位点的主备关系,备库说“我要从binlog文件A的位置P”开始同步,主库就从这个指定的位置开始往后发。
-
而主备关系搭建之后,是主库决定要发给数据给备库的,所以主库有新的日志也会发给备库。
MySQL 主备切换流程:
-
客户端读写都是直接访问A,而节点B是备库,只要将A的更新都同步过来,到本地执行就可以保证数据是相同的。
-
当需要切换的时候就把节点换一下,A的节点B的备库
一个事务完整的同步过程:
-
备库B和主库A建立来了长链接,主库A内部专门线程用于维护了这个长链接。
-
在备库B上通过changemaster命令设置主库A的IP端口用户名密码以及从哪个位置开始请求binlog包括文件名和日志偏移量
-
在备库B上执行start-slave命令备库会启动两个线程:io_thread和sql_thread分别负责建立连接和读取中转日志进行解析执行
-
备库读取主库传过来的binlog文件备库收到文件写到本地成为中转日志
-
后来由于多线程复制方案的引入,sql_thread演化成了多个线程。
38、什么是主备延迟
主库和备库在执行同一个事务的时候出现时间差的问题,主要原因有:
-
有些部署条件下,备库所在机器的性能要比主库性能差。
-
备库的压力较大。
-
大事务,一个主库上语句执行10分钟,那么这个事务可能会导致从库延迟10分钟。
39、为什么要有多线程复制策略?
-
因为单线程复制的能力全面低于多线程复制,对于更新压力较大的主库,备库可能是一直追不上主库的,带来的现象就是备库上seconds_behind_master值越来越大。
-
在实际应用中,建议使用可靠性优先策略,减少主备延迟,提升系统可用性,尽量减少大事务操作,把大事务拆分小事务。
40、MySQL 的并行策略有哪些?
-
按表分发策略:如果两个事务更新不同的表,它们就可以并行。因为数据是存储在表里的,所以按表分发,可以保证两个 worker 不会更新同一行。缺点:如果碰到热点表,比如所有的更新事务都会涉及到某一个表的时候,所有事务都会被分配到同一个 worker 中,就变成单线程复制了。
-
按行分发策略:如果两个事务没有更新相同的行,它们在备库上可以并行。如果两个事务没有更新相同的行,它们在备库上可以并行执行。显然,这个模式要求 binlog 格式必须是 row。缺点:相比于按表并行分发策略,按行并行策略在决定线程分发的时候,需要消耗更多的计算资源。