Mysql 大表查询和主备同步 入门教程

本文介绍了MySQL的大表查询原理,解释了为何不会爆内存,详细讲解了MySQL的临时表用法、存储引擎特性,特别是InnoDB和MEMORY引擎。同时,探讨了主备同步机制,包括主备延迟问题和多线程复制策略,旨在帮助读者理解MySQL数据库的高效管理和优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

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。缺点:相比于按表并行分发策略,按行并行策略在决定线程分发的时候,需要消耗更多的计算资源。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值