2025-03-06

10.2.5.1 优化INSERT语句

版本8.0
为了优化插入速度,可以将多个小操作合并为一个大操作。理想情况下,建立一次连接,一次性发送多个新行的数据,并将所有索引更新和一致性检查推迟到最后进行 。

插入一行所需的时间由以下因素决定,其中数字表示大致比例:

  • 连接:(3)
  • 向服务器发送查询:(2)
  • 解析查询:(2)
  • 插入行:(1×行大小)
  • 插入索引:(1×索引数量)
  • 关闭连接:(1)

这里没有考虑打开表的初始开销,每个并发运行的查询都会执行一次打开表操作。

假设使用B树索引,表的大小会使索引插入速度降低logN倍。

可以使用以下方法加快插入速度:

  • 如果要从同一客户端同时插入多行数据,可以使用带有多个VALUES列表的INSERT语句,一次插入多行。这比使用单独的单行INSERT语句要快得多(在某些情况下快很多倍)。如果要向非空表添加数据,可以调整bulk_insert_buffer_size变量,使数据插入速度更快。请参见7.1.8节 “服务器系统变量”。
  • 从文本文件加载表时,使用LOAD DATA。这通常比使用INSERT语句快20倍。请参见15.2.9节 “LOAD DATA语句”。
  • 利用列的默认值特性。仅当要插入的值与默认值不同时,才显式插入值。这可以减少MySQL必须进行的解析工作,提高插入速度。

有关InnoDB表的特定提示,请参见10.5.5节 “InnoDB表的批量数据加载”。

有关MyISAM表的特定提示,请参见10.6.2节 “MyISAM表的批量数据加载”。

10.2.5.2 优化UPDATE语句

版本8.0
UPDATE语句的优化方式与SELECT查询类似,但额外增加了写入操作的开销。写入速度取决于更新的数据量以及更新的索引数量,未发生变化的索引不会被更新。

另一种实现快速更新的方法是延迟更新操作,之后再连续进行多个更新。如果锁定表,那么一次性执行多个更新操作比逐个执行要快得多。

对于采用动态行格式的MyISAM表而言,若将一行更新为总长度更长的数据,可能会导致该行分裂。如果经常执行这类操作,偶尔使用OPTIMIZE TABLE语句就显得尤为重要。请参见15.7.3.4节 “OPTIMIZE TABLE语句”。

10.2.5.3 优化DELETE语句

删除MyISAM表中单行数据所需的时间与索引数量成正比。若要更快地删除行,可以通过增大key_buffer_size系统变量的值来扩大键缓存的大小,相关内容可查看7.1.1节 “配置服务器”。

若要删除MyISAM表中的所有行,使用TRUNCATE TABLE tbl_nameDELETE FROM tbl_name的速度更快。不过,截断操作不具备事务安全性,如果在活跃事务或表处于锁定状态时尝试执行截断操作,将会报错。更多信息可参考15.1.37节 “TRUNCATE TABLE语句”。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容