MySQL实战45讲课后问题

1、第一章

如果表T中没有字段k,而你执行了这个语句 select *fromTwhere k=1, 那肯定是会报“不存在这个列”的错误: “Unknown column ‘k’ in ‘where clause’”。你觉得这个错误是在我们上面提到的哪个阶段报出来的呢?

解答:是在分析器阶段,分析器阶段会对要执行的sql进行词法分析和语法分析,mysql会识别出sql语句里面的每个字符串分别是什么,代表什么,所以是在分析器阶段。

2、第二章

我说到定期全量备份的周期“取决于系统重要性,有的是一天一备,有的是一周一备”。那么在什么场景下,一天一备会比一周一备更有优势呢?或者说,它影响了这个数据库系统的哪个指标?

解答:一天一备跟一周一备对比,好处是"最长恢复时间更短",在一天一备的模式里,最坏情况下需要应用一天的binlog。比如,你每天0点做一次全量备份,而要恢复出一个到昨天晚上23点的备份。一周一备最坏情况就要应用一周的binlog了。

3、第三章

如何避免长事务对业务的影响?

解答:如何避免长事物要从应用端和数据库端两个方面来说:
首先,从应用开发端来看:

  1. 确认是否使用了set autocommit=0。这个确认工作可以在测试环境中开展,把MySQL的
    general_log开起来,然后随便跑一个业务逻辑,通过general_log的日志来确认。一般框架
    如果会设置这个值,也就会提供参数来控制行为,你的目标就是把它改成1。
  2. 确认是否有不必要的只读事务。有些框架会习惯不管什么语句先用begin/commit框起来。我
    见过有些是业务并没有这个需要,但是也把好几个select语句放到了事务中。这种只读事务
    可以去掉。
  3. 业务连接数据库的时候,根据业务本身的预估,通过SETMAX_EXECUTION_TIME命令,
    来控制每个语句执行的最长时间,避免单个语句意外执行太长时间。(为什么会意外?在后
    续的文章中会提到这类案例)

其次,从数据库端来看:

  1. 监控 information_schema.Innodb_trx表,设置长事务阈值,超过就报警/或者kill;
  2. Percona的pt-kill这个工具不错,推荐使用;
  3. 在业务功能测试阶段要求输出所有的general_log,分析日志行为提前发现问题;
  4. 如果使用的是MySQL 5.6或者更新版本,把innodb_undo_tablespaces设置成2(或更大的
    值)。如果真的出现大事务导致回滚段过大,这样设置后清理起来更方便。

4、第四章

对于上面例子中的InnoDB表T,如果你要重建索引 k,你的两个SQL语句可以这么写:

alter table T drop index k;
alter table T add index(k);

如果你要重建主键索引,也可以这么写:

alter table T drop primary key;
alter table T add primary key(id);

我的问题是,对于上面这两个重建索引的作法,说出你的理解。如果有不合适的,为什么,更好的方法是什么?

解答:重建索引k的做法是合理的,可以达到省空间的目的。但是,重建主键的过程不合理。不论是删除主键还是创建主键,都会将整个表重建。所以连着执行这两个语句的话,第一个语句就白做了。这两个语句,你可以用这个语句代替 : alter table Tengine=InnoDB。

5、第五章

DBA小吕在入职新公司的时候,就发现自己接手维护的库里面,有这么一个表,表结构定义类似这样的:

CREATE TABLE `geek` (`a` int(11) NOT NULL,`b` int(11) NOT NULL,`c` int(11) NOT NULL,`d` int(11) NOT NULL,PRIMARY KEY (`a`,`b`),KEY `c` (`c`),KEY `ca` (`c`,`a`),KEY `cb` (`c`,`b`)
) ENGINE=InnoDB;

公司的同事告诉他说,由于历史原因,这个表需要a、b做联合主键,这个小吕理解了。但是,学过本章内容的小吕又纳闷了,既然主键包含了a、b这两个字段,那意味着单独在字段c上创建一个索引,就已经包含了三个字段了呀,为什么要创建“ca”“cb”这两个索引?

同事告诉他,是因为他们的业务里面有这样的两种语句:

select * from geek where c=N order by a limit 1;
select * from geek where c=N order by b limit 1;

这位同事的解释对吗,为了这两个查询模式,这两个索引是否都是必须的?为什么呢?

解答:ca可以去掉,cb需要保留,因为ca的索引组织跟c的索引组织是一样的(因为在二级索引中,附带的主键是有序

6、第六章

当备库用–single-transaction做逻辑备份的时候,如果从主库的binlog传来一个DDL语句会怎么样?

假设这个DDL是针对表t1的, 这里我把备份过程中几个关键的语句列出来:

Q1:SET SESSION TRANSACTION ISOLATION LEVEL REPEATABLE READ;
Q2:START TRANSACTION WITH CONSISTENT SNAPSHOT/* other tables */
Q3:SAVEPOINT sp;
/* 时刻 1 */
Q4:show create table `t1`;
/* 时刻 2 */
Q5:SELECT * FROM `t1`;
/* 时刻 3 */
Q6:ROLLBACK TO SAVEPOINT sp;
/* 时刻 4 */
/* other tables */

在备份开始的时候,为了确保RR(可重复读)隔离级别,再设置一次RR隔离级别(Q1);

启动事务,这里用 WITH CONSISTENTSNAPSHOT确保这个语句执行完就可以得到一个一致性视图(Q2);

设置一个保存点,这个很重要(Q3);

showcreate 是为了拿到表结构(Q4),然后正式导数据 (Q5),回滚到SAVEPOINTsp,在这里的作用是释放 t1的MDL锁 。

DDL从主库传过来的时间按照效果不同,我打了四个时刻。题目设定为小表,我们假定到达后,如果开始执行,则很快能够执行完成。

参考答案如下:

  1. 如果在Q4语句执行之前到达,现象:没有影响,备份拿到的是DDL后的表结构。
  2. 如果在“时刻 2”到达,则表结构被改过,Q5执行的时候,报 Table definition has changed,
    please retry transaction,现象:mysqldump终止;
  3. 如果在“时刻2”和“时刻3”之间到达,mysqldump占着t1的MDL读锁,binlog被阻塞,现象:
    主从延迟,直到Q6执行完成。
  4. 从“时刻4”开始,mysqldump释放了MDL读锁,现象:没有影响,备份拿到的是DDL前的表
    结构。

7、第七章

怎么删除表的前10000行,有以下三种方法可以做到:

  • 第一种,直接执行delete fromTlimit 10000;
  • 第二种,在一个连接中循环执行20次 delete fromTlimit 500;
  • 第三种,在20个连接中同时执行delete fromTlimit 500。

比较多的留言都选择了第二种方式,即:在一个连接中循环执行20次 delete fromTlimit 500。

确实是这样的,第二种方式是相对较好的。

第一种方式(即:直接执行delete fromTlimit 10000)里面,单个语句占用时间长,锁的时间也比较长;而且大事务还会导致主从延迟。

第三种方式(即:在20个连接中同时执行delete fromTlimit 500),会人为造成锁冲突。

8、第八章

我用下面的表结构和初始化语句作为试验环境,事务隔离级别是可重复读。现在,我要把所有“字段c和id值相等的行”的c值清零,但是却发现了一个“诡异”的、改不掉的情况。请你构造出这种情况,并说明其原理。

mysql> CREATE TABLE `t` (`id` int(11) NOT NULL,`c` int(11) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB;
insert into t(id, c) values(1,1),(2,2),(3,3),(4,4);

在这里插入图片描述
复现出来以后,请你再思考一下,在实际的业务开发中有没有可能碰到这种情况?你的应用代码会不会掉进这个“坑”里,你又是怎么解决的呢?

上期的问题是:如何构造一个“数据无法修改”的场景。评论区里已经有不少同学给出了正确答案,这里我再描述一下。
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/235038.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网线的制作集线器交换机路由器的配置--含思维导图

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《产品经理如何画泳道图&流程图》 ⛺️ 越努力 ,越幸运 一、网线的制作 1、网线的材料有哪些? 网线 网线是一种用于传输数据信号的电缆,广泛应…

学生党评测FreeBuds SE 2,华为最便宜的TWS耳机体验如何?

华为最便宜的百元价位TWS耳机——FreeBuds SE 2值得入手吗?学生党实际使用一个多月,今天从个人主观使用感受来展开说说它的优缺点,如果说你正在观望要不要入手这款耳机,希望可以帮到你。 优点一:超长续航 对于我这种…

JMM的内存可见性保证

Java程序的 内存可见性保证 可以分为下列3类 1)单线程程序 单线程程序不会出现内存可见性问题。 编译器、runtime、处理器会共同确保单线程程序的执行结果与该程序在顺序一致性模型中的执行结果相同。 2)正确同步的多线程程序 Further Reading &…

YOLOv8改进 | 2023注意力篇 | HAttention(HAT)超分辨率重建助力小目标检测 (全网首发)

一、本文介绍 本文给大家带来的改进机制是HAttention注意力机制,混合注意力变换器(HAT)的设计理念是通过融合通道注意力和自注意力机制来提升单图像超分辨率重建的性能。通道注意力关注于识别哪些通道更重要,而自注意力则关注于图…

Redis cluster集群设置密码

Redis cluster集群设置密码 1 备份数据 # 链接redis集群,执行rdb快照 bgsave # 备份dump.rdb文件 cp /data/redis/cluster/dump.rdb /data/redis/cluster/backup/dump.rdb.202312202 设置密码 必须保证每个节点的密码保持一致,不然 Redirected 的时候会失败 2.1…

C : DS二叉排序树之删除

Description 给出一个数据序列,建立二叉排序树,并实现删除功能 对二叉排序树进行中序遍历,可以得到有序的数据序列 Input 第一行输入t,表示有t个数据序列 第二行输入n,表示首个序列包含n个数据 第三行输入n个数据…

Python 元组完全指南 1

元组用于在单个变量中存储多个项目。 mytuple ("apple", "banana", "cherry") 元组是 Python 中的 4 种内置数据类型之一,用于存储数据集合,另外还有列表、集合和字典,它们都具有不同的特性和用途。元组是有…

分布式锁解决方案之数据库乐观锁实现的分布式锁

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 分布式锁解决方案之数据库乐观锁实现的分布式锁 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文章目…

cpulimit设计理念及其思考

背景 前几天,同事咨询了我一个问题:IO占用能和cpu使用率那样,有方法来控制吗?这个问题的背景是因为客户提了两个需求,如下: 说实话,针对这两点需求,我的第一反应是有一点思路&#…

Linux 下 GCC 编译共享库控制导出函数的方法

通过一些实际项目的开发,发现这样一个现象,在 Windows 下可以通过指定 __declspec(dllexport) 定义来控制 DLL(动态链接库)中哪些函数可以导出,暴露给其他程序链接使用,哪些函数是 DLL 内部自己使用&#x…

复习linux——ssh服务

SSH服务 ssh:安全的远程登录,实现加密通信,代替传统的telnet协议 具体的软件实现 openssh:ssh协议的开源实现 dropbear:另一个ssh协议的开源项目的实现 ssh公钥交换原理 客户端发起连接请求——客户端得到服务端的公…

PIC单片机项目(5)——基于PIC16F877A的多功能防盗门

1.功能设计 本次设计的功能如下:如果红外对管检测到有人经过,LCD1602可以显示,我设计的是显示字符串“someone”。 如果有人强行破门,FSR402压力传感器会检测到压力过大,然后触发蜂鸣器报警,LCD1602也显示“…

物奇平台消息发收功能实现

物奇平台消息发收功能实现 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务,+群赠送语音信号处理降噪算法,蓝牙耳机音频,DSP音频项目核心开发资料, 1 外设中断消息发送方法

实验4.2 默认路由和浮动静态路由的配置

实验4.2 默认路由和浮动静态路由的配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.路由器的基本配置。2.配置默认路由,实现全网互通。3.配置浮动静态路由,实现链路备份。 六、任务验收七、任务小结八、知识链接1.默认路…

SpringBoot整合SpringDataJpa QueryDSL和原生态SQL

1.导入依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0…

【1) 40个powershell命令,掌握它们让你成为新一代命令行大神 2) mkdir, rmdir commands】

40 commands of poershell & mkdir, rmdir I) 40个powershell命令&#xff0c;掌握它们让你成为新一代命令行大神1.1&#xff09; URL1.2&#xff09;Basic 40 commands of powershell1.2.1) get-command1.2.1.1&#xff09;describe1.2.1.2&#xff09;mkdir dir_name, rm…

2023 英特尔On技术创新大会直播 |AI小模型更有性价比

前言&#xff1a; 今年是引爆AI的一年&#xff0c;从幼儿园的小朋友到80岁的老奶奶都认识AI&#xff0c;享受AI带来的便捷&#xff0c;都在向市场要智能&#xff0c;但AI的快速发展离不开底层硬件设施的革新。 英特尔是全球知名的半导体公司&#xff0c;专注于计算机处理器和芯…

pip基本操作指令大全

以下是一些pip的基本操作指令及其用途&#xff1a; 安装包&#xff1a; pip install package_name 安装指定的Python包。如果你想安装特定版本&#xff0c;可以这样指定&#xff1a; pip install package_nameversion_number 升级包&#xff1a; pip install --upgrade pack…

JavaScript 从基础到进阶 02:控制流程与函数

控制流程与函数 条件语句1. if语句2. else if语句3. switch语句 循环语句1. for循环2. while循环3. do...while循环 控制流程的关键概念1. break语句2. continue语句3. 标签&#xff08;label&#xff09; 总结函数的定义1. 函数声明2. 函数表达式 函数的调用函数的参数形参和实…

Goby 漏洞发布| Apusic 应用服务器 createDataSource 远程代码执行漏洞

漏洞名称&#xff1a;Apusic 应用服务器 createDataSource 远程代码执行漏洞 English Name&#xff1a;Apusic Application Server loadTree Remote Code Execution Vulnerability CVSS core: 9.8 影响资产数&#xff1a; 31410 漏洞描述&#xff1a; 金蝶 Apusic 应用服务…