第17问:如何评估 alter table 的进度?
时间:2022-07-22
本文章向大家介绍第17问:如何评估 alter table 的进度?,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
问题
我们执行 alter table 语句后,经常面临“跑又跑不完,杀又不敢杀”的窘境。
如果能评估 alter table 的进度就幸福多了。
实验
MySQL官方已经给出了文档:https://dev.mysql.com/doc/refman/5.7/en/monitor-alter-table-performance-schema.html,我们来实践一下:
先建个数据库:
我们设置了一些跟 performance_schema 相关的参数,开启了查看进度必要的功能。
还是按照之前实验 11 的技巧,快速造一些数据:
重复执行 insert,让表中有足够数据:
我们来跑一个alter table:
在另一个 session 中,执行 SQL 查看进度:
看起来 SQL 比较复杂,我们先来看看效果:
这里列出了正在执行的 DDL SQL,进度评估,当前运行语句的时间,和估算的剩余时间。
不断获取进度:
可以看到,估算的剩余时间不是完全精确,在整个过程中,进度在不停被评估。不过这种精确度对于我们也足够用了。
我们来看看评估的主要原理:
在这张表里,MySQL 提供了如下信息:
- DDL 语句运行的当前阶段
- 当前阶段的开始时间和结束时间,当前阶段未结束时,结束时间为当前时间
- 父事件 ID,语句运行的各个阶段,会具有相同的父事件 ID
- 工作量评估,MySQL 将 DDL 的运行过程拆成一个一个任务包,这里提供了已经完成的任务包数量和估算的任务包总数量,两者的比值即为当前进度
(注意:这里的时间是当前阶段的时间,而工作量评估是整个语句的工作量)
这下我们使用的评估 SQL 就不难看懂了:
附上评估语句的文字版:
select
stmt.SQL_TEXT as sql_text,
concat(WORK_COMPLETED, '/' , WORK_ESTIMATED) as progress,
(stage.TIMER_END - stmt.TIMER_START) / 1e12 as current_seconds,
(stage.TIMER_END - stmt.TIMER_START) / 1e12 * (WORK_ESTIMATED-WORK_COMPLETED) / WORK_COMPLETED as remaining_seconds
from events_stages_current stage, events_statements_current stmt
where stage.THREAD_ID = stmt.THREAD_ID
and stage.NESTING_EVENT_ID = stmt.EVENT_ID;
小贴士 肯定会有同学问:那开启 performance_schema 会不会影响性能呢? 答:在美好的生活面前,不要因噎废食,多用 1% 的 CPU,不会耗太多电的。
- OpenCV人脸识别之一:数据收集和预处理
- FFRPC应用之Client/Server
- Java8新特性——StreamAPI(二)
- 从WordPress SQLi谈PHP格式化字符串问题
- 自己实现PC端jQuery版轮播图
- Tips for thrift
- Java8新特性——StreamAPI(一)
- springcloud学习手册-Hystrix(仪表盘说明)
- RedRabbit——基于BrokerPattern服务器框架
- C++任务队列与多线程
- 游戏服务器ID生成器组件
- Java8新特性——Lambda表达式(一)
- C++ FFLIB之FFRPC:多线程&多进程的scalability探索
- ffrpc-c++进程间(服务器端、客户端)通信框架
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- LoRaWAN 帧计数机制及典型问题分析
- ffmpeg mp4解码管道输出的问题
- 机器人运动控制仿真:Matlab机器人工具箱和Simmechanics
- 使用HTMLTestRunner实现HTML测试报告
- Jmeter五步实现性能测试
- 测试工程师必须要掌握的linux命令
- Python之pip使用详解|附第三方库安装总结
- Python基础之数据类型详解
- 编码效率提升之Pycharm活动模板(Live Templates )
- crictl调试Kubernetes节点
- leetcode哈希表之好数对的数目
- Python处理excel的强大工具-openpyxl
- Pycharm最高效的快捷键集合
- 关于Python循环,看这一篇就够了
- Python新手常见错误汇总|附代码检查清单