MySQL 优化:优化 SQL 语句:优化数据更改语句(INSERT、UPDATE、DELETE)
跳到导航
跳到搜索
关于
【???好像……有时间去看 InnoDB 表的优化吧???】
优化 INSERT 语句
为了优化插入速度,请将许多小操作合并为一个大操作。理想情况下,您进行单个连接,一次发送许多新行的数据,并将所有索引更新和一致性检查延迟到最后。
插入行所需的时间由以下因素决定,其中数字表示近似比例:
- Connecting: (3)
- 向服务器发送查询:(2)
- 解析查询:(2)
- 插入行:(1×行大小)
- 插入索引:(1×索引数)
- Closing: (1)
这没有考虑打开表的初始开销,对于每个并发运行的查询,该开销只需要执行一次即可。
假设 B 树索引,表的大小会减慢“logN”的索引插入速度。
您可以使用以下方法来加快插入速度:
- 如果要同时从同一 Client 端插入许多行,请使用具有多个“VALUES”列表的“INSERT”语句一次插入几行。这比使用单独的单行“INSERT”语句要快得多(某些情况下要快很多倍)。如果要将数据添加到非空表,则可以调整“bulk_insert_buffer_size”变量以使数据插入更快。
- 从文本文件加载表时,请使用“LOAD DATA”。这通常比使用“INSERT”语句快 20 倍。
- 利用列具有默认值的事实。仅当要插入的值与默认值不同时才明确插入值。这减少了 MySQL 必须执行的解析,并提高了插入速度。
优化 UPDATE 语句
优化了一条更新语句,类似于“SELECT”查询,但具有额外的写操作开销。写入速度取决于要“更新的数据量”和“要更新的索引数”。【不变的索引不会更新】
获得快速更新的另一种方法是延迟更新,然后在以后连续进行许多更新。如果锁定表,一起执行多个更新要比一次执行一次更新快得多。
对于使用动态行格式的 MyISAM 表,将行更新为更长的总长度可能会拆分该行。如果您经常这样做,那么偶尔使用“OPTIMIZE TABLE”非常重要。
优化 DELETE 语句
- 删除 MyISAM 表中的各个行所需的时间与索引的数量成正比。要更快地删除行,可以通过增加“key_buffer_size”系统变量来增加键高速缓存(Key cache)的大小。
- 要删除 MyISAM 表中的所有行,“TRUNCATE TABLE tbl_name”比“DELETE FROM tbl_name”快。
- 截断操作不是事务安全的:在活动事务或活动表锁定过程中尝试执行时将发生错误。