8.2.5.1-优化insert语句

为了优化插入速度,将多个小操作合并成一个大操作。理想情况下,你建立一个连接,一次性发送多行新记录数据,然后延迟索引更新和一致性检查,直到结束。

插入一条记录需要时间取决于以下因素,其中数字表示大致比例:

  • 连接(3)
  • 发送查询到服务器(2)
  • 解析查询语句:(2)
  • 插入记录:(1* 行记录数据大小)
  • 插入索引: (1 * 索引数量)
  • 关闭:(1) 这里没有考虑打开表的初始开销(每个并发运行的查询执行一次)。

如果用的是B-TREE索引的话,表的大小会影响索引插入的速度(logN)。你可以使用下面的方法来加速插入:

  • 如果你用同一个客户端同时 插入多条记录,使用insert + values列表的方式来一次插入数条记录。这通常会比每次插入一条快很多(有时会快很多倍)。如果你在向一张非空表插入数据,可以调节变量 bulk_insert_buffer_size的值,来进一步加快插入速度。查阅章节5.1.8,“Sever System Variables”。
  • 在从一个文本文件加载表时,使用load data。这通常比使用insert语句快20倍。查阅章节13.2.9,“LOAD DATA STATEMENT”。
  • 充分利用列的默认值功能。只有当和默认值不一样时才指明相关列,这会减少MySQL必须做的解析sql工作,提高插入速度。
  • 请查阅章节8.5.5,“Bulk Data Loading for InnoDB Tables”,了解关于InnoDB表的相关建议。
  • 请查阅章节8.6.2,“Bulk Data loading for MyISAM Tables”,了解关于MyISAM表的相关建议。