【问题标题】:Best way to regenerate massive MySQL tables重新生成大量 MySQL 表的最佳方法
【发布时间】:2010-10-16 08:27:24
【问题描述】:

我正在开发一个需要每天重建几个非常大的 MyISAM 表的应用程序(主要是搜索使用最新行业和站点数据重建的表)。用于重建这些表的查询非常繁重,不适合针对主生产数据库运行。

我们有一个单独的服务器专门用于生成这些表,并且我们使用主从复制在我们用作重建查询的一部分的处理服务器上保持生产数据库的最新副本。我的问题是,一旦构建了这些表,将它们转移到生产数据库中的最佳方法是什么(有效地删除旧表并用新表替换它)?

我们之前刚刚在服务器之间移动了二进制数据和索引文件并复制到位。但是,这与复制效果不佳。

此任务还有哪些其他方法?生产数据库和加工数据库之间的主主复制有用吗?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    如何在单独的表中构建新表,例如“newfoo”,只要你需要生成它就让它发生,当你准备好交换它时,只需rename

    drop table if exists oldfoo;
    rename table foo to oldfoo, newfoo to foo;
    

    【讨论】:

    • 我们已经在这样做了——但从根本上说,大型查询仍将在生产 mysqld 实例上运行,这将冲击服务器(即使它没有锁定任何表)。跨度>
    【解决方案2】:

    很久以前我遇到过同样的问题,这就是我所做的:使用两张表,一张用于偶数日,另一张用于奇数日。

    因此,通过代码或存储过程,您可以通过将一年中的天数除以二并检查结果来选择插入该日期的位置。

    奇数天你处理偶数表,反之亦然。

    这是我们用来选择表格的代码

    <?php
    $day_of_year = (int) date('z');
    $table_sufix = $day_of_year % 2 ? "even" : "odd";
    $insert_on = "table_" . $table_sufix;
    
    ?>
    

    过程

    <?php
    $day_of_year = (int) date('z');
    $table_sufix = $day_of_year % 2 ? "odd" : "even"; // note only this little change
    $process_table = "table_" . $table_sufix;
    
    ?>
    

    【讨论】:

      猜你喜欢
      • 2018-02-04
      • 2013-06-04
      • 1970-01-01
      • 2020-07-17
      • 2010-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多