mysql获取删除的条数_确定要删除的MySQL行数以达到目标数据库大...

我有一个包含3个表(A,B,C)的数据库,需要将其保持在一定阈值以下.

A与B和C具有一对多关系…

具体来说,A,B和C具有称为“ g_id”的col,该col用于建立相互之间的关系.有点像图结构,其中A,B和C分别是图,节点和边.

我的目标是:每天,脚本都会获取该数据库的大小,并从这三个表中删除行,直到数据库的总大小缩减到目标大小为止.

我尝试了以下操作:

>使用以下命令获取数据库的大小

SELECT

TABLE_NAME,

round(((DATA_LENGTH + INDEX_LENGTH) / 1024 / 1024), 2) as SIZE_MB

FROM

information_schema.TABLES

WHERE

TABLE_NAME in ('A', 'B', 'C') AND

TABLE_SCHEMA = DATABASE()

ORDER BY

SIZE_MB DESC

>尝试估计(A,B,C)的每个逻辑分组相对于其g_id的大小…

SELECT

g_id,

SUM(length(col1)) + SUM(constant) as total

FROM (

(SELECT A.g_id, A.col1, 22 as constant FROM A) UNION ALL

(SELECT B.g_id, B.col1, 22 as constant FROM B) UNION ALL

(SELECT C.g_id, C.col1, 22 as constant FROM C) UNION ALL

) ABC

GROUP BY g_id

ORDER BY g_id;

其中22常数只是每行存储一些固定的bigint,时间戳等的成本的粗略估计…而col1是具有可变长度的文本字段.

>将第2部分加载到内存中后,循环遍历选定的行,并以编程方式将g_ids添加到列表中,直到选择了足够的行以进行删除为止,以使数据库恢复到所需的大小.

>最后,对表A,B,C执行DELETE WHERE g_id IN({g_ids})…

问题是从第1部分返回的大小似乎招致了一些“开销”成本.例如,当我运行第1部分时,数据库的大小约为3 GB,但是当我将第2部分中的所有行加起来时,它的大小仅为2 GB.随着表格的增长,似乎没有可预见的增长差异.

由information_schema.TABLES报告的大小不一致和估计的SUM查询使我删除的行超出了实际需要.

一些问题:

>我是否甚至以正确的方式解决此问题?

>我的计算方法是否可行?

>如何确定间接费用?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值