如何使用 perl 优化 mysql 插入?

如何使用 perl 优化 mysql 插入?

我有一个 perl 日志解析器,它在每一行都使用 mysql 插入或更新命令。例如:

Log line 1: 2012-12-01 12:12 [perld] Hello world #1
....
Log line N: 2012-12-01 12:NN [perld] Hello world #N

它解析这些行并获取“时间戳”和“#N”并将它们插入到 mysql db 中(使用 perl::tail 函数解析行)。

我每秒大约有 100 行,因此大约有 100 条插入到 mysql。

有什么解决方案/算法可以优化这个问题吗?或者我应该使用类似带插入功能的缓冲区?

答案1

您可以检查以下几点。您可以尝试存储过程(准备好的语句)。这可以使用 perl 中的 dbi->prepare 方法实现。这通常比多次执行相同的查询更快,因为您只需要发送参数。

您还可以尝试将多个插入语句合并为一个并将它们作为单个语句执行。

另外,如果您还没有使用 MyISAM,您可以尝试一下。它比 InnoDB 更快。如果您不使用事务,您可以尝试一下。

答案2

检查表上的索引 - 如果有您不需要的索引,则查询可能会花费比所需更长的时间。

另外,你确定是你的 sql 占用了时间吗?正如 Khaled 所说,预先准备查询可能会让你受益,但其他地方可能也会很慢。例如,你说你解析一个日期,也许用 Date::Manip 很容易就能完成,但速度并不快!在开始之前,一定要知道哪里需要优化 :)

答案3

MySQL 支持多行插入,如下所示:

INSERT INTO sometable (field1, field2) VALUES
(1, 2),
(2, 3),
(3, 4);

等等。您可以在解析完该秒内的所有行后每秒执行一次插入,或者(更好的是)允许在运行时设置阈值,这将允许您通过实验确定性能方面的设置。

相关内容