这些性能提示补充了快速插入的通用指南,在第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为索引创建分配更多的临时内存,而不是让服务器为索引重新创建分配内存。您也可以使用以下语句禁用或启用
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 节,“配置服务器”。