草庐IT

MySQL:在具有固定列的表上需要优化表吗?

coder 2023-10-05 原文

我有一个每周脚本,它从我们的实时数据库中移动数据并将其放入我们的存档数据库中,然后删除它刚刚从实时数据库中存档的数据。因为它是一个合适的大小删除(大约 10% 的表被修剪),我想我应该在这个删除之后运行 OPTIMIZE TABLE。

但是,我正在从 mysql 文档中阅读此内容,但我不知道如何解释它: http://dev.mysql.com/doc/refman/5.1/en/optimize-table.html

"OPTIMIZE TABLE 应该被使用,如果你已经删除了一个表的很大一部分,或者如果你对一个具有可变长度行的表(具有 VARCHAR、VARBINARY、BLOB 或 TEXT 列的表)做了很多更改。已删除行在链表中维护,后续 INSERT 操作重用旧行位置。您可以使用 OPTIMIZE TABLE 回收未使用的空间并对数据文件进行碎片整理。”

第一句话对我来说是模棱两可的。这是否意味着您应该在以下情况下运行它: A)你已经删除了一个表的大部分行变长,或者如果你对一个行变长的表做了很多更改 或者 B) 您删除了任何表的大部分,或者如果您对具有可变长度行的表进行了许多更改

这有意义吗?因此,如果我的表没有 VAR 列,我还需要运行它吗?

当我们讨论这个主题时 - 是否有任何指示器告诉我一个表已经适合 OPTIMIZE 调用?

另外,我读了这个http://www.xaprb.com/blog/2010/02/07/how-often-should-you-use-optimize-table/这表示仅运行 OPTIMIZE 表对主键有用。如果我的大部分选择都来自其他索引,我是否只是在具有代理键的表上浪费精力?

非常感谢!

最佳答案

在您的情况下,我认为定期优化表格不会产生明显的不同。

首先,您对文档的第二个解释 (B) 是正确的 - “如果您删除了任何表的大部分,或者如果您对具有可变长度行的表进行了许多更改。”

如果您的表没有 VAR 列,则每条记录,无论其包含的数据如何,都会在表中占用完全相同的空间量。如果从表中删除一条记录,并且数据库选择重新使用上一条记录存储的确切区域,它可以这样做而不会浪费任何空间或碎片化您的数据。

至于 OPTIMIZE 是否仅提高使用主键索引的查询的性能,这个答案几乎肯定会根据所使用的存储引擎而有所不同,恐怕我无法回答这个问题.

但是,说到存储引擎,如果您最终使用了 OPTIMIZE,请注意它不喜欢在 InnoDB 表上运行,因此命令映射到 ALTER 并重建表,这可能是一个更昂贵的操作.无论哪种方式,表都会在优化期间锁定,因此在运行它时要非常小心。

关于MySQL:在具有固定列的表上需要优化表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3391737/

有关MySQL:在具有固定列的表上需要优化表吗?的更多相关文章

  1. ruby - 我需要将 Bundler 本身添加到 Gemfile 中吗? - 2

    当我使用Bundler时,是否需要在我的Gemfile中将其列为依赖项?毕竟,我的代码中有些地方需要它。例如,当我进行Bundler设置时:require"bundler/setup" 最佳答案 没有。您可以尝试,但首先您必须用鞋带将自己抬离地面。 关于ruby-我需要将Bundler本身添加到Gemfile中吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/4758609/

  2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

    我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

  3. ruby - rspec 需要 .rspec 文件中的 spec_helper - 2

    我注意到像bundler这样的项目在每个specfile中执行requirespec_helper我还注意到rspec使用选项--require,它允许您在引导rspec时要求一个文件。您还可以将其添加到.rspec文件中,因此只要您运行不带参数的rspec就会添加它。使用上述方法有什么缺点可以解释为什么像bundler这样的项目选择在每个规范文件中都需要spec_helper吗? 最佳答案 我不在Bundler上工作,所以我不能直接谈论他们的做法。并非所有项目都checkin.rspec文件。原因是这个文件,通常按照当前的惯例,只

  4. ruby - 如何在 Lion 上安装 Xcode 4.6,需要用 RVM 升级 ruby - 2

    我实际上是在尝试使用RVM在我的OSX10.7.5上更新ruby,并在输入以下命令后:rvminstallruby我得到了以下回复:Searchingforbinaryrubies,thismighttakesometime.Checkingrequirementsforosx.Installingrequirementsforosx.Updatingsystem.......Errorrunning'requirements_osx_brew_update_systemruby-2.0.0-p247',pleaseread/Users/username/.rvm/log/138121

  5. ruby-on-rails - Rails 3.1 中具有相同形式的多个模型? - 2

    我正在使用Rails3.1并在一个论坛上工作。我有一个名为Topic的模型,每个模型都有许多Post。当用户创建新主题时,他们也应该创建第一个Post。但是,我不确定如何以相同的形式执行此操作。这是我的代码:classTopic:destroyaccepts_nested_attributes_for:postsvalidates_presence_of:titleendclassPost...但这似乎不起作用。有什么想法吗?谢谢! 最佳答案 @Pablo的回答似乎有你需要的一切。但更具体地说...首先改变你View中的这一行对此#

  6. ruby-on-rails - 使用 ruby​​ 将多个实例变量转换为散列的更好方法? - 2

    我收到格式为的回复#我需要将其转换为哈希值(针对活跃商家)。目前我正在遍历变量并执行此操作:response.instance_variables.eachdo|r|my_hash.merge!(r.to_s.delete("@").intern=>response.instance_eval(r.to_s.delete("@")))end这有效,它将生成{:first="charlie",:last=>"kelly"},但它似乎有点hacky和不稳定。有更好的方法吗?编辑:我刚刚意识到我可以使用instance_variable_get作为该等式的第二部分,但这仍然是主要问题。

  7. ruby - 为什么在 ruby​​ 中创建 Rational 不需要新方法 - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Rubysyntaxquestion:Rational(a,b)andRational.new!(a,b)我正在阅读ruby镐书,我对创建有理数的语法感到困惑。Rational(3,4)*Rational(1,2)产生=>3/8为什么Rational不需要new方法(我还注意到例如我可以在没有new方法的情况下创建字符串)?

  8. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  9. ruby - 在 Ruby 中将整数格式化为固定长度的字符串 - 2

    有没有一种简单的方法可以将给定的整数格式化为具有固定长度和前导零的字符串?#convertnumberstostringsoffixedlength3[1,12,123,1234].map{|e|???}=>["001","012","123","234"]我找到了解决方案,但也许还有更聪明的方法。format('%03d',e)[-3..-1] 最佳答案 如何使用%1000而不是进行字符串操作来获取最后三位数字?[1,12,123,1234].map{|e|format('%03d',e%1000)}更新:根据theTinMan的

  10. ruby - 具有两个参数的 block - 2

    我从用户Hirolau那里找到了这段代码:defsum_to_n?(a,n)a.combination(2).find{|x,y|x+y==n}enda=[1,2,3,4,5]sum_to_n?(a,9)#=>[4,5]sum_to_n?(a,11)#=>nil我如何知道何时可以将两个参数发送到预定义方法(如find)?我不清楚,因为有时它不起作用。这是重新定义的东西吗? 最佳答案 如果您查看Enumerable#find的文档,您会发现它只接受一个block参数。您可以将它发送两次的原因是因为Ruby可以方便地让您根据它的“并行赋

随机推荐