10.6.2 MyISAM 表的批量数据加载
这些性能提示补充了对于快速插入的通用指导,参见第10.2.5.1节,“优化INSERT语句”。
-
对于一个MyISAM表,你可以使用并发插入来在执行
SELECT
语句的同时添加行,只要数据文件中没有删除的行。请参阅第10.11.3节,“并发插入”。 -
通过一些额外的工作,你可以让
LOAD DATA
对于一个MyISAM表运行得更快,尤其是当表有很多索引时。请按照以下步骤进行:-
使用myisamchk --keys-used=0 -rq
/path/to/db/tbl_name
移除对表的所有索引使用。 -
使用
LOAD DATA
插入数据。这不会更新任何索引,因此速度非常快。 -
如果你打算将来只从表中读取数据,请使用myisampack对其进行压缩。请参阅第18.2.3.3节,“压缩表特性”。
-
重新创建索引使用myisamchk -rq
/path/to/db/tbl_name
。这在内存中创建索引树,然后将其写入磁盘,这比在LOAD DATA
期间更新索引要快得多,因为它避免了大量的磁盘寻道。生成的索引树也完美平衡。
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
、UPDATE
和DELETE
操作在MySQL中非常快,但通过在多于五个连续的插入或更新操作周围添加锁定,可以获得更好的整体性能。如果你做了很多连续的插入,你可以每隔1,000行左右使用LOCK TABLES
和UNLOCK TABLES
来允许其他线程访问表,这样也会带来性能的显著提升。 -
-
为了提高
MyISAM
表的性能,无论是使用LOAD DATA
还是INSERT
, 你可以通过增加key_ buffer_size
系统变量来扩大键缓存。请参阅第7.1.1节,“配置服务器”。