Documentation Home
MySQL 8.3 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 40.8Mb
PDF (A4) - 40.9Mb
Man Pages (TGZ) - 294.0Kb
Man Pages (Zip) - 409.0Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb
Excerpts from this Manual

MySQL 8.3 Reference Manual  /  ...  /  Bulk Data Loading for MyISAM Tables

10.6.2 批量数据加载到MyISAM表

这些性能提示补充了快速插入的通用指南,在第10.2.5.1节,“优化INSERT语句”中。

  • 对于一个MyISAM表,您可以使用并发插入来同时添加行,同时SELECT语句正在运行,如果数据文件中没有删除的行。请参阅第10.11.3节,“并发插入”

  • 通过一些额外的工作,可以使LOAD DATA语句对于MyISAM表运行得更快,当表具有许多索引时。使用以下过程:

    1. 执行FLUSH TABLES语句或mysqladmin flush-tables命令。

    2. 使用myisamchk --keys-used=0 -rq /path/to/db/tbl_name删除表的所有索引使用。

    3. 使用LOAD DATA语句将数据插入表中。这不更新任何索引,因此非常快。

    4. 如果您只想从表中读取数据,将使用myisampack压缩表。请参阅第18.2.3.3节,“压缩表特征”

    5. 使用myisamchk -rq /path/to/db/tbl_name重新创建索引。这在内存中创建索引树,然后将其写入磁盘,这比在LOAD DATA语句期间更新索引要快得多,因为它避免了许多磁盘寻道。结果索引树也将是完美平衡的。

    6. 执行FLUSH TABLES语句或mysqladmin flush-tables命令。

    LOAD DATA语句自动执行前面的优化,如果您插入数据的MyISAM表为空。主要区别在于自动优化和显式使用过程之间的是,您可以让myisamchk为索引创建分配更多的临时内存,而不是让服务器为索引重新创建分配内存。

    您也可以使用以下语句禁用或启用MyISAM表的非唯一索引,而不是使用myisamchk。如果您使用这些语句,可以跳过FLUSH TABLES操作:

    ALTER TABLE tbl_name DISABLE KEYS;
    ALTER TABLE tbl_name ENABLE KEYS;
  • 要加速INSERT操作,这些操作是使用多个语句执行的非事务表,锁定您的表:

    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语句完成后刷新到磁盘。通常情况下,每个INSERT语句都会刷新索引缓冲区。如果您可以使用单个INSERT语句插入所有行,则不需要显式锁定语句。

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

    • 连接 1 执行 1000 次插入

    • 连接 2、3 和 4 执行 1 次插入

    • 连接 5 执行 1000 次插入

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

    INSERTUPDATEDELETE 操作在 MySQL 中非常快,但您可以通过在执行五个以上连续插入或更新操作时添加锁来获得更好的总体性能。如果您执行了很多连续插入,可以每 1,000 行左右执行一次 LOCK TABLES,然后执行一次 UNLOCK TABLES,以允许其他线程访问表。这仍将导致很好的性能提升。

    INSERT 仍然比 LOAD DATA 慢得多,即使使用上述策略。

  • 要提高 MyISAM 表的性能,既用于 LOAD DATA 也用于 INSERT,可以通过增加 key_buffer_size 系统变量来扩大键缓存。请参阅 第 7.1.1 节,“配置服务器”