【问题标题】:MySQL INSERT on large table - can I improve speed performance?大表上的 MySQL INSERT - 我可以提高速度性能吗?
【发布时间】:2010-09-06 23:09:09
【问题描述】:

我有一个 MyISAM 表,其中包含 2 个字段 f1 和 f2,它们都是无符号整数并且不能为空。该表故意没有主键,但它在 f2 上有一个索引。该表目前有 3.2 亿行。

我希望能够以不错的速度将新行(每周大约 4000 行)插入到该表中。但是,目前我在 2 分钟内插入了大约 4000 行。 (我正在使用文本文件和“源”命令来执行此操作 - 文本文件仅包含在此表中的 INSERT 语句)。有没有一种方法可以加快插入语句的速度?另外,在执行 INSERT 语句时,对同一个表的任何 SELECT/JOIN 语句是否会受到影响或变慢?

【问题讨论】:

  • 想法:MySQL 5.1 新增表分区

标签: mysql performance insert


【解决方案1】:

您可以将插入语句从

INSERT INTO table (f1, f2) VALUES ($f1, $f2);
INSERT INTO table (f1, f2) VALUES ($other, $other);
etc...

进入

INSERT INTO table (f1, f2) VALUES ($f1, $f2), ($other, $other), etc...

这将在一定程度上减少解析开销。这可能会加快速度。但是,不要过度对插入进行分组,因为查询受max_allowed_packet 设置的约束。

2 分钟内 4000 行仍然是每秒 33 行。这还不算太破旧,尤其是在必须更新索引的大表上。您可以在执行插入之前禁用表上的键,然后使用REPAIR TABLE 再次重建键,但这可能需要更长的时间,尤其是要扫描 3.2 亿行时。你必须做一些基准测试,看看它是否值得。

至于 SELECTS/JOINS,因为您使用的是 MISAM 表,所以在事务完成之前无法隐藏事务中的新表。每一行在输入时都会立即对其他会话可见,除非您锁定表以便您获得对它的独占访问权以进行插入。但是,当插入运行时,您已将其他所有人锁定在外。

【讨论】:

  • 其他2种方法包括,将数据加载到一个新的临时表中,然后将它们插入到主表中,并使用insert into table select * from temp;或使用 LOAD DATA INFILE 批量加载它们
【解决方案2】:

据我所知,source-command 是最快的方法。由于该表是 MyISAM,因此在写入操作期间整个表都被锁定。所以是的,所有SELECT-statements 都排队等待所有插入/更新/删除完成。

【讨论】:

    【解决方案3】:

    如果要加载的数据可以被数据库访问,您可以使用LOAD DATA INFILE 命令。如手册所述:

    LOAD DATA INFILE 语句读取 行从文本文件到表中 速度非常快。

    希望对您有所帮助。

    【讨论】:

    • 谢谢,我使用了 LOAD DATA INFILE。我将需要插入多达 200,000 行,而这仍然需要很长时间才能启用索引。所以我尝试了 ALTER TABLE...DISABLE KEYS,...LOAD DATA INFILE ...ALTER TABLE...ENABLE KEYS。然而,3.2 亿行的启用键需要很长时间。我在想是否可以在 .cnf 文件中进行一些调整以加快速度?
    【解决方案4】:

    @rjk 是正确的。 LOAD DATA INFILE 是将数据放入表中的最快方法。很少有其他想法。

    对于 4k 行,2 分钟对我来说似乎很长。 SELECT 会阻止 MyISAM 中的 INSERT,并且可能会减慢您的插入速度。我强烈建议 InnoDB 没有此问题以及更好的崩溃恢复等。如果您必须使用 MyISAM,在运行插入之前锁定表可能会有所帮助,或者您可以尝试 INSERT DELAYED 这将允许 INSERT 语句立即返回并成为表空闲时处理。

    【讨论】:

    • 您好,感谢您的评论。我不想使用 InnoDB,因为我的系统主要由 SELECT 查询组成,我只需要每周执行一次 INSERT,在此期间系统将被关闭,因此甚至不会有任何并发​​选择。我使用了 LOAD DATA INFILE,但键的启用(禁用后)需要很长时间。我现在想尝试优化这个重新启用的密钥。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 1970-01-01
    • 1970-01-01
    • 2011-10-14
    相关资源
    最近更新 更多