### 8.6.2 MyISAM 表的批量数据加载

[](<>)

这些性能提示补充了快速插入的一般准则[第 8.2.5.1 节，“优化 INSERT 语句”](insert-optimization.html).

-   为一个`MyISAM`表，您可以使用并发插入同时添加行[`选择`](select.html)如果数据文件中间没有已删除的行，则语句正在运行。看[第 8.11.3 节，“并发插入”](concurrent-inserts.html).

-   通过一些额外的工作，可以使[`加载数据`](load-data.html)跑得更快`MyISAM`当表有很多索引时。使用以下过程：

    1.  执行一个[`同花顺表`](flush.html#flush-tables)声明或[**mysqladmin 刷新表**](mysqladmin.html)命令。

    2.  采用[**myisamchk --keys-used=0 -rq*`/path/to/db/tbl_name`***](myisamchk.html)删除对表的所有索引的使用。

    3.  将数据插入表中[`加载数据`](load-data.html).这不会更新任何索引，因此非常快。

    4.  如果您将来只打算从表中读取，请使用[**myisampack**](myisampack.html)压缩它。看[第 16.2.3.3 节，“压缩表特征”](compressed-format.html).

    5.  重新创建索引[**myisamchk -rq*`/path/to/db/tbl_name`***](myisamchk.html).这会在将索引树写入磁盘之前在内存中创建索引树，这比更新索引时要快得多[`加载数据`](load-data.html)因为它避免了大量的磁盘寻道。生成的索引树也是完美平衡的。

    6.  执行一个[`同花顺表`](flush.html#flush-tables)声明或[**mysqladmin 刷新表**](mysqladmin.html)命令。

    [`加载数据`](load-data.html)如果`MyISAM`插入数据的表是空的。自动优化和显式使用过程之间的主要区别在于，您可以让[**迈萨姆奇克**](myisamchk.html)为索引创建分配的临时内存比您希望服务器在执行索引重新创建时分配的内存多得多[`加载数据`](load-data.html)陈述。

    您还可以禁用或启用非唯一索引`MyISAM`使用以下语句而不是表[**迈萨姆奇克**](myisamchk.html).如果你使用这些语句，你可以跳过[`同花顺表`](flush.html#flush-tables)操作：

    ```
    ALTER TABLE tbl_name DISABLE KEYS;
    ALTER TABLE tbl_name ENABLE KEYS;
    ```

-   加快[`插入`](insert.html)对非事务性表使用多个语句执行的操作会锁定您的表：

    ```
    LOCK TABLES a WRITE;
    INSERT INTO a VALUES (1,23),(2,34),(4,33);
    INSERT INTO a VALUES (8,26),(6,29);
    ...
    UNLOCK TABLES;
    ```

    这对性能有好处，因为索引缓冲区只刷新到磁盘一次，毕竟[`插入`](insert.html)语句已完成。通常，索引缓冲区刷新次数与索引缓冲区刷新次数一样多[`插入`](insert.html)陈述。如果您可以使用单个插入所有行，则不需要显式锁定语句[`插入`](insert.html).

    锁定还降低了多连接测试的总时间，尽管单个连接的最大等待时间可能会因为它们等待锁定而增加。假设五个客户端尝试同时执行插入操作，如下所示：

    -   连接 1 执行 1000 次插入

    -   连接 2、3 和 4 做 1 个插入

    -   连接 5 进行 1000 次插入

        如果不使用锁定，则连接 2、3 和 4 在 1 和 5 之前完成。如果使用锁定，连接 2、3 和 4 可能不会在 1 或 5 之前完成，但总时间应该在 40% 左右快点。

    [`插入`](insert.html),[`更新`](update.html)， 和[`删除`](delete.html)MySQL 中的操作非常快，但是您可以通过在执行超过大约 5 次连续插入或更新的所有内容周围添加锁来获得更好的整体性能。如果你做了很多连续的插入，你可以做一个[`锁定表`](lock-tables.html)其次是[`解锁桌子`](lock-tables.html)偶尔（每 1,000 行左右）允许其他线程访问表。这仍然会带来不错的性能提升。

    [`插入`](insert.html)加载数据仍然比加载数据慢得多[`加载数据`](load-data.html)，即使使用刚刚概述的策略。

-   为了提高性能`MyISAM`表，对于两者[`加载数据`](load-data.html)和[`插入`](insert.html)，通过增加[`key_buffer_size`](server-system-variables.html#sysvar_key_buffer_size)系统变量。看[第 5.1.1 节，“配置服务器”](server-configuration.html).
