我有一个由大量 blob 组成的表,我想对其进行一些测试。
我知道删除的空间不会被 innodb 回收,所以我决定通过更新它自己的值而不是创建新记录来重用现有记录。
但我注意到,无论是删除和插入新条目,还是对现有 ROW 进行更新,InnoDB 都在不断增长。
假设我有 100 行,每行存储 500KB 的信息,我的 InnoDB 大小是 10MB,现在当我对所有行调用 UPDATE(无插入/无删除)时,innodb 每次运行都会增长约 8MB。我所做的只是在每一行中存储恰好 500KB 的数据,几乎没有修改,并且 blob 的大小是固定的。
我能做些什么来防止这种情况发生?
我知道优化表,但我做不到,因为在正常使用情况下,该表将有 60-100GB 大,运行优化只会使整个服务器停止运行。
最佳答案
But I noticed, whether I delete and insert a new entry, or I do UPDATE on existing ROW, InnoDB keeps on growing.
InnoDB 是一个多版本系统。
这意味着每次更新或删除一行时,该行的先前版本都会被复制到一个称为回滚段 的特殊位置。原始记录被新数据重写(在 UPDATE 的情况下)或标记为已删除(在 DELETE 的情况下)。
如果您执行事务回滚或执行并发 SELECT 语句(由于新版本尚未提交,因此必须查看以前的版本),从 rollback 中检索数据段。
问题在于 InnoDB 表空间从不收缩。如果表空间已满,则分配新空间。已提交事务的回滚信息占用的空间也可以重复使用,但如果表空间已满,它将被扩展,这是永久性的。
除了备份整个数据库、删除并重新创建 InnoDB 文件以及从备份中恢复之外,没有支持的方法来缩小 ibdata* 文件。
即使您使用 innodb_file_per_table 选项,回滚表空间仍存储在共享的 ibdata* 文件中。
但是请注意,表占用的空间和表空间占用的空间是不同的东西。可以通过运行 OPTIMIZE 来缩小表,这将使它们更紧凑(在表空间内),但表空间本身不能缩小。
关于mysql - 为什么 InnoDB 在没有每次更新的情况下继续增长?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4546294/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用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
我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
我有一个奇怪的问题:我在rvm上安装了rubyonrails。一切正常,我可以创建项目。但是在我输入“railsnew”时重新启动后,我有“程序'rails'当前未安装。”。SystemUbuntu12.04ruby-v"1.9.3p194"gemlistactionmailer(3.2.5)actionpack(3.2.5)activemodel(3.2.5)activerecord(3.2.5)activeresource(3.2.5)activesupport(3.2.5)arel(3.0.2)builder(3.0.0)bundler(1.1.4)coffee-rails(
这是在Ruby中设置默认值的常用方法:classQuietByDefaultdefinitialize(opts={})@verbose=opts[:verbose]endend这是一个容易落入的陷阱:classVerboseNoMatterWhatdefinitialize(opts={})@verbose=opts[:verbose]||trueendend正确的做法是:classVerboseByDefaultdefinitialize(opts={})@verbose=opts.include?(:verbose)?opts[:verbose]:trueendend编写Verb
它不等于主线程的binding,这个toplevel作用域是什么?此作用域与主线程中的binding有何不同?>ruby-e'putsTOPLEVEL_BINDING===binding'false 最佳答案 事实是,TOPLEVEL_BINDING始终引用Binding的预定义全局实例,而Kernel#binding创建的新实例>Binding每次封装当前执行上下文。在顶层,它们都包含相同的绑定(bind),但它们不是同一个对象,您无法使用==或===测试它们的绑定(bind)相等性。putsTOPLEVEL_BINDINGput