Mysql 自增主键ID 并联 copy tab 入门教程

本文介绍了MySQL自增主键不连续的原因,包括事务回滚、唯一键冲突和批量申请等。还讨论了一主一备与一主多从的区别、主库问题的解决方法,如GTID的使用。同时,提到了读写分离中的过期读问题及解决方案,如强制走主库、GTID等。此外,文章还涵盖了提高MySQL性能的短期策略,包括处理空闲连接和优化SQL查询。最后,探讨了复制表的快速方法,包括物理拷贝和数据导入导出。

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

在这里插入图片描述

41、MySQL的一主一备和一主多从有什么区别?

在一主一备的双 M 架构里,主备切换只需要把客户端流量切到备库;而在一主多从架构里,主备切换除了要把客户端流量切到备库外,还需要把从库接到新主库上。

42、主库出问题如何解决

  • 基于位点的主备切换:存在找同步位点这个问题

  • MySQL 5.6 版本引入了 GTID,彻底解决了这个困难。那么,GTID 到底是什么意思,又是如何解决找同步位点这个问题呢?

  • GTID:全局事务 ID,是一个事务在提交的时候生成的,是这个事务的唯一标识;它由两部分组成,格式是:GTID=server_uuid:gno

  • 每个 MySQL 实例都维护了一个 GTID 集合,用来对应“这个实例执行过的所有事务”。

  • 在基于 GTID 的主备关系里,系统认为只要建立主备关系,就必须保证主库发给备库的日志是完整的。因此,如果实例 B 需要的日志已经不存在,A’就拒绝把日志发给 B。

43、MySQL 读写分离涉及到过期读问题的几种解决方案

  • 强制走主库方案

  • sleep 方案

  • 判断主备无延迟方案

  • 配合 semi-sync 方案

  • 等主库位点方案

  • GTID 方案。

  • 实际生产中,先客户端对请求做分类,区分哪些请求可以接受过期读,而哪些请求完全不能接受过期读;然后,对于不能接受过期读的语句,再使用等 GTID 或等位点的方案。

44、MySQL的并发链接和并发查询有什么区别?

  • 在执行show processlist的结果里,看到了几千个连接,指的是并发连接。而"当前正在执行"的语句,才是并发查询。

  • 并发连接数多影响的是内存,并发查询太高对CPU不利。一个机器的CPU核数有限,线程全冲进来,上下文切换的成本就会太高。

  • 所以需要设置参数:innodb_thread_concurrency 用来限制线程数,当线程数达到该参数,InnoDB就会认为线程数用完了,会阻止其他语句进入引擎执行。

性能相关

45、短时间提高 MySQL 性能的方法

  • 第一种方法:先处理掉那些占着连接但是不工作的线程。或者再考虑断开事务内空闲太久的连接。kill connection + id

  • 第二种方法:减少连接过程的消耗:慢查询性能问题在 MySQL 中,会引发性能问题的慢查询,大体有以下三种可能:索引没有设计好;SQL 语句没写好;MySQL 选错了索引(force index)。

46、为什么 MySQL 自增主键 ID 不连续?

  • 唯一键冲突

  • 事务回滚

  • 自增主键的批量申请

  • 深层次原因是:MySQL 不判断自增主键是否存在,从而减少加锁的时间范围和粒度,这样能保持更高的性能,确保自增主键不能回退,所以才有自增主键不连续。

  • 自增主键怎么做到唯一性?自增值加1来通过自增锁控制并发。

47、InnoDB 为什么要用自增 ID 作为主键?

  • 自增主键的插入模式,符合递增插入,每次都是追加操作,不涉及挪动记录,也不会触发叶子节点的分裂。

  • 每次插入新的记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。

  • 而有业务逻辑的字段做主键,不容易保证有序插入,由于每次插入主键的值近似于随机

  • 因此每次新纪录都要被插到现有索引页得中间某个位置, 频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,写数据成本较高。

48、如何最快的复制一张表?

  • 为了避免对源表加读锁,更稳妥的方案是先将数据写到外部文本文件,然后再写回目标表

  • 一种方法是,使用 mysqldump 命令将数据导出成一组 INSERT 语句

  • 另一种方法是直接将结果导出成.csv 文件。MySQL 提供语法,用来将查询结果导出到服务端本地目录:select * from db1.t where a>900 into outfile ‘/server_tmp/t.csv’;得到.csv 导出文件后,你就可以用下面的 load data 命令将数据导入到目标表 db2.t 中:load data infile ‘/server_tmp/t.csv’ into table db2.t;

  • 物理拷贝:在 MySQL 5.6 版本引入了可传输表空间(transportable tablespace) 的方法,可以通过导出 + 导入表空间的方式,实现物理拷贝表的功能。

49、grant 和 flush privileges语句

  • grant语句会同时修改数据表和内存,判断权限的时候使用的内存数据,因此,规范使用是不需要加上 flush privileges 语句。

  • flush privileges 语句本身会用数据表的数据重建一份内存权限数据,所以在权限数据可能存在不一致的情况下再使用。

50、要不要使用分区表?

  • 分区并不是越细越好。实际上,单表或者单分区的数据一千万行,只要没有特别大的索引,对于现在的硬件能力来说都已经是小表了。

  • 分区也不要提前预留太多,在使用之前预先创建即可。比如,如果是按月分区,每年年底时再把下一年度的 12 个新分区创建上即可。对于没有数据的历史分区,要及时的 drop 掉。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值