我在Perl中有一个日志parsing器,它在每一行使用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
它parsing这些行,并获取“时间戳”和“#N”,并将它们插入到MySQL数据库(parsing与perl :: tail函数行)。
我有约100行/秒,所以将有大约100插入到MySQL。
有什么解决scheme/algorithm来优化? 或者,也许我应该使用像插入缓冲区的东西?
这几点你可以检查。 您可以尝试存储过程(准备语句)。 这可以在perl中使用dbi-> prepare方法来实现。 这通常比执行多次相同的查询要快,因为只需要发送参数。
你还可以尝试的一件事是将多个插入语句组合成一个,并将它们作为单个语句执行。
另外,如果你还没有使用MyISAM,你可以试试。 它比InnoDB更快。 如果您不使用交易,您可以尝试。
检查表格中的索引 – 如果有的话,您不需要查询,可能会花费比需要更长的时间。
另外,你确定你的SQL是花费时间 – 正如Khaled所说,你可能从预先准备查询中受益,但也可能有其他地方的东西慢 – 例如,你说你parsing一个date – 也许用Date :: Manip轻松完成 – 但不是很快! 确保你知道哪里需要优化之前,你开始:)
MySQL支持多行插入,如下所示:
INSERT INTO sometable (field1, field2) VALUES (1, 2), (2, 3), (3, 4);
等等。您可以在parsing所有行之后每秒钟执行一次插入,或者(更好)允许在运行时设置阈值,这将允许您通过试验确定性能方面的设置。