【问题标题】:Move million records from MEMORY table to MYISAM table将百万条记录从 MEMORY 表移动到 MISAM 表
【发布时间】:2011-02-07 08:57:03
【问题描述】:

我正在寻找一种将记录从 MEMORY 表移动到 MYISAM 表的快速方法。 MEMORY 表有大约 50 万条记录。两个表具有完全相同的结构(相同的列数、数据类型等)。但是 MISAM 表在几列上被索引(B-TREE)。大约有 25 列,其中大部分是无符号整数。

我已经尝试过使用“INSERT INTO SELECT * FROM”查询。但是有没有更快的方法来做到这一点?

感谢您的帮助。

普拉尚特

【问题讨论】:

    标签: java c++ sql mysql database


    【解决方案1】:

    其他人指出——您不应该在插入期间使用索引。 您可以在每次插入时禁用更新它们:

    ALTER TABLE table DISABLE KEYS;
    INSERT INTO table
    ALTER TABLE tbl_name ENABLE KEYS;
    

    并且还锁定一个表以获得单索引写入:

    LOCK TABLES table WRITE;
    INSERT INTO table
    UNLOCK TABLES;
    

    无论如何,如果您在单个 INSERT ... SELECT 中使用它,您可能 没有获得显着的性能提升。

    您还可以在服务器配置中调整bulk_insert_buffer_size 设置。

    更多信息:http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html

    【讨论】:

      【解决方案2】:

      原则上,您应该通过以下方式获得良好的性能:

      1. 创建没有二级索引的目标表。

      2. 根据目标表的主键对源表的内容进行排序。

      3. 将排序后的记录插入到目标表中。

      4. 一次添加一个二级索引。

      【讨论】:

      • 是的,除了在MyISAM中,添加二级索引会重建所有索引和数据文件,所以你真的想一次添加所有索引。
      【解决方案3】:

      这可能主要是关于调整。 MyISAM 表最初是空的吗?如果是这样,您可以做一些作弊 - 在加载期间禁用索引,然后启用它们(这在非空表上不是一个好主意)。

      在内存表上执行 ORDER BY 并不是一个特别好的主意,因为它们通常使用哈希索引,因此无法进行中序索引扫描,因此会引入额外的 filesort(),这可能很糟糕。

      【讨论】:

        猜你喜欢
        • 2019-10-22
        • 1970-01-01
        • 1970-01-01
        • 2013-05-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-06
        • 1970-01-01
        相关资源
        最近更新 更多