• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • MyISAM表批量插入数据

    这些性能提示补充了“优化INSERT语句”中有关快速插入的一般准则。

    • 对于MyISAM表,SELECT如果数据文件中间没有删除的行,则可以在语句运行的同时使用并发插入来添加行。请参见“并发插入”。
    • 通过做一些额外的工作,可以在表具有多个索引的情况下使表的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对其进行压缩。请参见“压缩表特性”。
      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%快点。

      INSERT,,UPDATEDELETE操作在MySQL中非常快,但是您可以通过在执行大约五个以上的连续插入或更新的所有操作周围添加锁来获得更好的整体性能。如果执行许多连续的插入操作,则可以LOCK TABLES不时进行UNLOCK TABLES一次插入操作(每行大约1,000行),以允许其他线程访问表。这仍然会带来不错的性能提升。

      INSERTLOAD DATA即使使用上述策略,加载数据的速度仍然比慢得多。

    • 为了提高MyISAM表的性能,对于LOAD DATAINSERT,都可以通过增加key_buffer_size系统变量来扩大键缓存。请参见“配置服务器”。