介绍
以下内容可以提高MyISAM数据插入效率:
-
对于MyISAM引擎的表,你可以在查询的时候使用并发插入,你只要保证在数据文件的中间没有删除的记录。
-
通过一些额外的工作,当表具有许多索引时,可以使表LOAD DATA INFILE更快地 运行 MyISAM。使用以下过程:
- 执行FLUSH TABLES 语句或mysqladmin flush-tables命令。
- 使用myisamchk --keys-used = 0 -rq /path/to/db/tbl_name 删除表的所有索引使用。
- 使用LOAD DATA INFILE插入数据,不会更新索引,所以导入很快。
- 假如表不会再次进行更新,可以使用myisampack进行压缩。
- 使用myisamchk -rq /path/to/db/tbl_name重新创建索引。这会在将内容写入磁盘之前在内存中创建索引树,这比LOAD DATA INFILE同时更新索引要快得多,因为它避免了大量的磁盘搜索。生成的索引树也完美平衡。
- 执行FLUSH TABLES 语句或mysqladmin flush-tables命令。
如果LOAD DATA INFILE插入的是空表,则会自动执行上述优化。自动优化和明确使用过程之间的主要区别在于,您可以让myisamchk为索引创建分配比临时内存更多的内存,而不是服务器在执行LOAD DATA INFILE语句时为索引重新创建分配的内存。
您还可以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插入所有需要数据则不需要显示执行LOCK语句。
Locking还可以减低多个连接测试的总时间,虽然单个连接的最长等待时间可能会因为等待锁定而上升。假如有5个客户端执行插入:
- 连接1执行1000次插入
- 连接2,3和4进行1次插入
- 连接5执行1000次插入
如果不使用锁定,则连接2,3和4在1和5之前完成。如果使用锁定,则连接2,3和4可能在1或5之前未完成,但总时间应可以快40%。
INSERT, UPDATE和 DELETE 在MySQL里是很快的,但是,通过在所有执行超过五个连续插入或更新操作的内容周围添加锁,可以获得更好的总体性能。假如你在进行大量的连续插入,可以在LOCK TABLES之后定期执行 UNLOCK TABLES (插入1000条或者类似条件),短暂的释放锁,让其他线程执行。 这仍然会带来不错的性能提升。
为了提高性能MyISAM 表,对于 LOAD DATA INFILE和INSERT,通过增加放大键缓存 key_buffer_size系统变量。