mysql 碎片率_计算MySQL表碎片的SQL整理

原标题:计算MySQL表碎片的SQL整理

这是学习笔记的第 2111 篇文章

在之前整理过一版MySQL的数据字典,整理了一圈,发现远比想象的复杂。

当然整理的过程不光是知识梳理的过程,也是转化为实践场景的一个过程,通过这样一个体系,对于整个MySQL对象生命周期管理有了较为深入的认识,这里我来抛砖引玉,来作为深入学习MySQL数据字典的一个入口,这个问题就是:如何较为准确的计算MySQL碎片情况?

我想碎片的情况在数据库中是很少有清晰的界定,不过它的的确确会带来副作用,通过修复碎片情况我们可以提高SQL的执行效率,同时能够释放大量的空间。

最近在思考中感悟到:我们所做的很多事情,难点主要都在于查找,比如我告诉你test库的表test_data存在大量碎片,需要修复一下,这个难度是完全可控的,我们可以很麻利的处理好,但是如果我告诉你需要收集下碎片情况,然后做一下改进,而不告诉你具体的情况,其实难度就会高几个层次。

我们这个场景主要会用到两个数据字典表:

information_schema.tables

information_schema.INNODB_SYS_TABLESPACES

我们依次来看一下两个数据字典的输出信息:

查询常规的数据字典tables得到的信息基本可以满足我们的大多数需求。

mysql> select *from information_schema.tables where table_name='tgp_redis_command'\G

*************************** 1. row ***************************

TABLE_CATALOG: def

TABLE_SCHEMA: tgp_db

TABLE_NAME: tgp_redis_command

TABLE_TYPE: BASE TABLE

ENGINE: InnoDB

VERSION: 10

ROW_FORMAT: Dynamic

TABLE_ROWS: 477103

AVG_ROW_LENGTH: 111

DATA_LENGTH: 53035008

MAX_DATA_LENGTH: 0

INDEX_LENGTH: 0

DATA_FREE: 5242880

AUTO_INCREMENT: 478096

CREATE_TIME: 2019-08-16 10:54:02

UPDATE_TIME: 2019-09-23 21:12:05

CHECK_TIME: NULL

TABLE_COLLATION: utf8_general_ci

CHECKSUM: NULL

CREATE_OPTIONS:

TABLE_COMMENT: redis命令执行记录表

1 row in set (0.00 sec)

通过tables字典我们可以得到通过逻辑计算出来的预估表大小,包括数据和索引的空间情况,还有平均行长度来作为校验。

但是在这里我们总是会感觉有些隔靴搔痒,因为我们通过计算得到了逻辑大小,但是我们还是无从得知物理文件的大小,如果逐个去通过du方式计算,这个成本是很高的,而且如果有很多的表,这种模式的效率和代价是不大合理的,所幸MySQL 5.7版本中的innodb_sys_tablespaces这个数据字典做了扩容,有了新的字段FILE_SIZE,可以完美的解决我们的疑虑,使用innodb_sys_tablespaces得到的结果如下:

mysql> select *from INNODB_SYS_TABLESPACES where name like 'tgp_db/tgp_redis_command'\G

*************************** 1. row ***************************

SPACE: 818

NAME: tgp_db/tgp_redis_command

FLAG: 33

FILE_FORMAT: Barracuda

ROW_FORMAT: Dynamic

PAGE_SIZE: 16384

ZIP_PAGE_SIZE: 0

SPACE_TYPE: Single

FS_BLOCK_SIZE: 4096

FILE_SIZE: 62914560

ALLOCATED_SIZE: 62918656

1 row in set (0.00 sec)

比如常规来说我们要得到表tgp_redis_command的物理文件大小(即.ibd文件),可以通过INNODB_SYS_TABLESPACES 来查询得到,这是一个缓存中刷新得到的实时的值,远比我们通过du等方式计算要快捷方便许多。

可以做一个简单的计算,表里的数据量为:

mysql> select count(*) from tgp_redis_command;

+----------+

| count(*) |

+----------+

| 478093 |

+----------+

1 row in set (0.06 sec)

物理文件的大小,和innodb_sys_tablespaces的结果是完全一致的。

# ll *redis*

-rw-r----- 1 mysql mysql 9176 Aug 16 10:54 tgp_redis_command.frm

-rw-r----- 1 mysql mysql 62914560 Sep 23 21:14 tgp_redis_command.ibd

所以表的大小逻辑计算为data_length+index_length=53035008+0,大约是50M左右,而物理文件大小是60M左右,那么碎片率大约是(60-50)/60约等于16.7%

我们做一下数据的truncate操作,发现物理文件的大小很快收缩了。

mysql> select *from INNODB_SYS_TABLESPACES where name like 'tgp_db/tgp_redis_command'\G

*************************** 1. row ***************************

SPACE: 818

NAME: tgp_db/tgp_redis_command

FLAG: 33

FILE_FORMAT: Barracuda

ROW_FORMAT: Dynamic

PAGE_SIZE: 16384

ZIP_PAGE_SIZE: 0

SPACE_TYPE: Single

FS_BLOCK_SIZE: 4096

FILE_SIZE: 98304

ALLOCATED_SIZE: 102400

1 row in set (0.00 sec)

mysql> select *from information_schema.tables where table_name='tgp_redis_command'\G

*************************** 1. row ***************************

TABLE_CATALOG: def

TABLE_SCHEMA: tgp_db

TABLE_NAME: tgp_redis_command

TABLE_TYPE: BASE TABLE

ENGINE: InnoDB

VERSION: 10

ROW_FORMAT: Dynamic

TABLE_ROWS: 0

AVG_ROW_LENGTH: 0

DATA_LENGTH: 16384

MAX_DATA_LENGTH: 0

INDEX_LENGTH: 0

DATA_FREE: 0

AUTO_INCREMENT: 1

CREATE_TIME: 2019-08-16 10:54:02

UPDATE_TIME: 2019-09-24 09:51:22

CHECK_TIME: NULL

TABLE_COLLATION: utf8_general_ci

CHECKSUM: NULL

CREATE_OPTIONS:

TABLE_COMMENT: redis命令执行记录表

1 row in set (0.00 sec)

[root@hb30-dba-mysql-tgp-124-34 tgp_db]# ll *redis*

-rw-r----- 1 mysql mysql 9176 Aug 16 10:54 tgp_redis_command.frm

-rw-r----- 1 mysql mysql 98304 Sep 24 09:55 tgp_redis_command.ibd

当然这种计算方式是不够完整的,而且不够清晰,我们可以写一个简单的SQL来做下统计,就是把那些需要修复的表列出来即可。

SQL如下:

SELECT

t.table_schema,

t.table_name,

t.table_rows,

t.data_length+

t.index_length data_size,

t.index_length index_size,

t.avg_row_length,

t.avg_row_length * t.table_rows logic_size,

s.FILE_SIZE,

truncate(s.FILE_SIZE/ (t.data_length+ t.index_length)*1.1*2 ,0)tab_frag

FROM

information_schema.tables t,

information_schema.INNODB_SYS_TABLESPACES s

WHERE

t.table_type = 'BASE TABLE'

and concat(t.table_schema,'/',t.table_name)=s.name

and t.table_schema not in ('sys','information_schema','mysql','test')

-- and t.table_schema in('tgp_db','test')

and s.FILE_SIZE >102400000

and (t.data_length+ t.index_length)*1.1*2 < s.FILE_SIZE

order by s.FILE_SIZE;

以如下的输出为例,我们可以看到整个碎片率极高,基本就是逻辑大小为100M,实际大小为500M,类似这种情况。

其中对于逻辑大小的计算做了一些取舍,默认在MySQL中变化的数据在10%以外是会重新去统计计算的,所以我们可以把基数调整的稍大一些为1.1,然后以这个为基线,如果碎片率超过了200%则计入统计结果中。

通过这种方式我们可以很快的分析出那些要具体修复的表,而整个性能的分析也可以更加清晰。

稍后,把它包装为一个批量异步任务,通过异步任务来得到尽可能完整的碎片表列表,然后集中去处理就好了。返回搜狐,查看更多

责任编辑:

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

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

相关文章

全志A10 Bootload加载过程分析

A10的启动过程大概可分为5步&#xff1a;BootRom&#xff0c;SPL&#xff0c;Uboot&#xff0c;Kernel&#xff0c;RootFileSystem。本文只关注镜像的加载过程&#xff0c;分析RootRom->SPL->Uboot的启动流程。系统上电后&#xff0c;ARM处理器在复位时从地址0x000000开始…

android老 电池,为什么安卓手机不会因为电池的老化而降频呢?

前段时间&#xff0c;苹果手机的降频事件也是闹的沸沸扬扬&#xff0c;库克也为此进行了公开道歉&#xff0c;各位的吃瓜群众也是看的不亦乐乎&#xff0c;于是&#xff0c;也有不少的小伙伴会问&#xff1a;“为什么安卓手机不会因为电池的老化而降频&#xff1f;”今天&#…

华为笔记本软件商店_华为应用市场电脑版

华为应用市场电脑版是一款手机自带的应用商店下载中心&#xff0c;华为应用市场电脑版能够为用户提供新鲜、好玩的Android应用&#xff0c;华为应用市场电脑版能完美运行的应用和游戏&#xff0c;软件拥有独家“一键安装”的功能&#xff0c;它拥有智能搜索引擎&#xff0c;它也…

解决bbb无法加载uImage问题

使用sdk6&#xff0c;emmc的烧写都完成后&#xff0c;uboot启动后&#xff0c;无法加载uImage。 修改u-boot include/configs/am335x_evm.h的 CONFIG_EXTRA_ENV_SETTINGS 环境变量设置 将mmcdev0改为1即可 因为bbb上面&#xff0c;emmc是在mmc1上面&#xff0c;sd卡是在m…

修改spfile位置

虽然很多地方不建议这么做&#xff0c;可是有HA、oracle软件建在本地盘的情况下&#xff0c;如果spfile放在dbs下&#xff0c;会导致每次修改spfile都要去手动copy到备机上&#xff0c;这是很麻烦的一件事情&#xff0c;所以我把spflie放在随ha切换的存储磁盘上。 &#xff08;…

android 解析错误 真机,AndroidStudio使用真机调试时出的一些bug

文章目录说明高德地图报错 - 错误代码7, key错误OPPO/VIVO手机安装时包解析错误说明此处记录一些这种情况的bug : 在用正式签名打包上线使用的时候没问题, 但是使用USB安装调试的时候会有的bug .高德地图报错 - 错误代码7, key错误场景 : 使用AndroidStudio开发&#xff0c;项目…

mybatis plug 只查id_Mybatis一对多/多对多查询时只查出了一条数据

问题描述:如果三表(包括了关系表)级联查询&#xff0c;主表和明细表的主键都是id的话&#xff0c;明细表的多条数据只能查询出来第一条/最后一条数据。三个表&#xff0c;权限表(Permission)&#xff0c;权限组表(PermissionGroup)&#xff0c;权限组与权限的关系表(Permission…

Javascript设置对象属性为只读

有时为了保护某些属性&#xff0c;让其无法被更改&#xff0c;我们会把他们设置为常量。 在某些语言里面&#xff0c;也许会用const来实现这样的功能。本文讲述如何在Javascript中实现这样的功能。 方法一: var myObject {get readOnlyProperty() { return 1024; } };alert(my…

linux下gsoap的初次使用 (c)

这两天&#xff0c;接到一个项目&#xff0c;需要在linux程序中调用远程的web应用&#xff0c;通过soap协议。开始上网查了下资料&#xff0c;发现了gsoap库这个好东东^_^。继续在网上搜索例子代码&#xff0c;发现基本都不可编译通过&#xff0c;于是便一边学习一边写了这个最…

android 5.0.1 libdvm.so,Android逆向进阶—— 脱壳的奥义(基ART模式下的dump)

本文作者&#xff1a;i春秋作家HAI_ZHU000 前言市面上的资料大多都是基于Dalvik模式的dump&#xff0c;所以这此准备搞一个ART模式下的dump。Dalvik模式是Android 4.4及其以下采用的模式&#xff0c;之后到了Android 5.0 之后就是ART模式&#xff0c;关于这两个模式的详细内容&…

python bunch制作可导入数据_Python bunch包_程序模块 - PyPI - Python中文网

bunch是一个支持属性样式访问的字典&#xff0c;一个la javascript。>>> b Bunch()>>> b.hello world>>> b.helloworld>>> b[hello] "!">>> b.helloworld!>>> b.foo Bunch(lolTrue)>>> b.foo.lo…

浪潮之巅 笔记

14.2 诺威格(Peter Norvig&#xff0c;Google研究院主任&#xff0c;ACM Fellow&#xff0c;人工智能专家)定理&#xff1a;当一个公司的市场占有率超过50%后&#xff0c;就无法再使市场占有率翻翻了。在一个市场占有主导地位的公司必须不断开拓新的财源&#xff0c;才能做到长…

Linux下gSOAP的使用 (c++)

1、下载gSOAP在gSOAP官网中可以找到最新的gSOAP安装包以及相关的文档gSOAP官网&#xff1a;http://www.cs.fsu.edu/~engelen/soap.htmlgSOAP下载地址&#xff1a;http://sourceforge.net/projects/gsoap2/files/ 2、安装gSOAPa、解压zip压缩包命令&#xff1a;unzip gsoap_2.7.…

android+3.0新加的动画,Android动画片

使用Android两年多了&#xff0c;工作中的动画也动能应付&#xff0c;自认为Android中的动画自己也能用个八九不离十&#xff0c;结果我在学习[Periscope点赞效果](http://www.jianshu.com/p/03fdcfd3ae9c)的时候发现动画的这些高级功能我从没用过、也没见过&#xff0c;静下来…

xy坐标转换度分秒_经纬度转换XY坐标软件

经纬度与XY坐标转换工具是一款非常好用的坐标转换器&#xff0c;能够将经纬度转换为XY坐标&#xff0c;对于从事地理相关工作者还是很有用的。有了它就不必去记住公式了&#xff0c;只需输入数值&#xff0c;点击一下就行了。软件功能1、度分秒和度的转换2、经纬度和xy的转换3、…

LeetCode-Scramble String

哎&#xff0c;难题又不会做&#xff0c; 思路没有什么难度&#xff0c; 关键是要把问题思考透彻&#xff0c; 要考虑的要点还是挺多的&#xff0c;不容易一下子都考虑到&#xff1b; 我开始的思路是按照树的根去递归的&#xff0c; 这样就必须要没有重复元素&#xff0c;因为需…

在线打开html文件,html是什么文件?html文件怎么打开?

html是什么&#xff1f;html即超文本标记语言&#xff0c;现在大多网页都是html的格式。而所谓的html文件是一种超文本文件&#xff0c;其中超文本可以是图片或音乐等非文字元素&#xff0c;使用很广泛。但是很多用户都不太明白html是什么文件&#xff1f;也不清楚html文件要如…

gsoap使用心得! (win32)

最近换了个工作环境&#xff0c;现在在大望路这边上班&#xff0c;呵&#xff0c;刚上班接到的任务就是熟悉gsoap&#xff01;废话少说&#xff0c;现在开始gSoap学习&#xff01;gSOAP是一个夸平台的&#xff0c;用于开发Web Service服务端和客户端的工具&#xff0c;在Window…

hbase中列簇和列_为什么不建议在hbase中使用过多的列簇

我们知道&#xff0c;hbase表可以设置一个至多个列簇(column families)&#xff0c;但是为什么说越少的列簇越好呢&#xff1f;官网原文&#xff1a;HBase currently does not do well with anything above two or three column families so keep the number of column familie…

html怎么置顶导航栏,css怎么实现滚动页面导航栏固定在顶部

css怎么实现滚动页面导航栏固定在顶部(吸顶效果)功能&#xff1a;当网页向下滚动时&#xff0c;导航栏一直在固定在顶部一、css设置这里主要用到css中position中的relative与fixed&#xff1b;其中relative是生成相对定位的元素&#xff0c;相对于其正常位置进行定位。fixed是生…