Documentation Home
MySQL 8.4 Reference Manual
Related Documentation Download this Manual
PDF (US Ltr) - 39.8Mb
PDF (A4) - 39.9Mb
Man Pages (TGZ) - 257.9Kb
Man Pages (Zip) - 364.9Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 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为索引创建分配更多的临时内存,而不是服务器在执行LOAD DATA语句时分配的。

    你还可以通过以下语句来禁用或启用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 TABLESUNLOCK TABLES来允许其他线程访问表,这样也会带来性能的显著提升。

    INSERT在使用上述策略时仍然比LOAD DATA慢得多,用于加载数据。

  • 为了提高MyISAM表的性能,无论是使用LOAD DATA还是INSERT, 你可以通过增加key_ buffer_size系统变量来扩大键缓存。请参阅第7.1.1节,“配置服务器”