我有一个包含 3 个表(A、B、C)的数据库,我需要将它们保持在某个阈值大小以下。
A 与 B 和 C 具有一对多关系...
具体来说,A、B、C 有一个名为“g_id”的列,用于建立彼此之间的关系。有点像图结构,其中 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 常量只是对每行存储一些固定 bigints、时间戳等的成本的粗略估计...而 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 查询报告的这种大小不一致让我删除了比实际需要更多的行。
一些问题:
最佳答案
我认为您考虑删除 记录的做法是错误的。删除记录是一项非常昂贵的操作。
相反,您应该使用表分区。我不太确定逻辑是什么,但所有三个表都可以根据 g_id 进行分区。假设这是按顺序分配的,您可以创建大约一天的新图的批处理。
然后您可以通过删除旧分区来“删除”行。
关于mysql - 确定要删除的 MySQL 行数以达到目标数据库大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52901725/
我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为
查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html
我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的
我正在编写一个方法,它将在一个类中定义一个实例方法;类似于attr_accessor:classFoocustom_method(:foo)end我通过将custom_method函数添加到Module模块并使用define_method定义方法来实现它,效果很好。但我无法弄清楚如何考虑类(class)的可见性属性。例如,在下面的类中classFoocustom_method(:foo)privatecustom_method(:bar)end第一个生成的方法(foo)必须是公共(public)的,第二个(bar)必须是私有(private)的。我怎么做?或者,如何找到调用我的cust
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
几个月前,我读了一篇关于rubygem的博客文章,它可以通过阅读代码本身来确定编程语言。对于我的生活,我不记得博客或gem的名称。谷歌搜索“ruby编程语言猜测”及其变体也无济于事。有人碰巧知道相关gem的名称吗? 最佳答案 是这个吗:http://github.com/chrislo/sourceclassifier/tree/master 关于ruby-寻找通过阅读代码确定编程语言的rubygem?,我们在StackOverflow上找到一个类似的问题:
在Ruby中是否有Gem或安全删除文件的方法?我想避免系统上可能不存在的外部程序。“安全删除”指的是覆盖文件内容。 最佳答案 如果您使用的是*nix,一个很好的方法是使用exec/open3/open4调用shred:`shred-fxuz#{filename}`http://www.gnu.org/s/coreutils/manual/html_node/shred-invocation.html检查这个类似的帖子:Writingafileshredderinpythonorruby?
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_