在试图弄清楚 AWK 或 MySQL 是否更有效地处理日志文件和返回聚合统计信息时,我注意到以下对我来说没有意义的行为:
为了测试这一点,我使用了一个包含 4 列和大约 900 万条记录的文件。我使用了同一台服务器,它是一个带有 SSD 和 1GB RAM 的 VPS。
column1 是具有大约 10 个唯一值的列,所有列组合的唯一值总数约为 4k。
在 MySQL 中,我使用一个定义为表(column1、column2、column3、column4)的表,没有索引。
数据格式:
第 1 列,第 2 列,第 3 列,第 4 列 第 1 列,第 2 列,第 3 列,第 4 列
AWK 脚本:
BEGIN {
FS = ",";
time = systime();
} {
array[$1]++; #first test
#array[$1 "," $2 "," $3 "," $4]++; #second test
}
} END {
for (value in array) {
print "array[" value "]=" array[value];
}
}
MySQL 查询:
Query 1: SELECT column1, count(*) FROM log_test GROUP BY column1;
Query 2: SELECT column1, column2, column3, column4, count(*)
FROM log_test GROUP BY column1, column2, column3, column4;
正如预期的那样,AWK 比 MySQL 慢。但是,当我运行第一个返回包含 10 行的聚合数据的测试时,MySQL 大约需要 7 秒才能完成,而 AWK 大约需要 22 秒。
我知道 awk 逐行读取并处理数据,所以我希望当我运行第二个测试时,输出为 4k 行,AWK 应该花费与第一个测试相同的时间,即它仍然有相同数量的要读取的行,并且它没有做更多的处理。然而,AWK 大约需要 90 秒,但只使用 0.1% 的 MEM,而 MySQL 大约需要 45 秒,使用 3% 的 MEM。
- 当 AWK 本质上读取同一个文件时,为什么测试 2 比测试 1 花费的时间要长得多?
- 为什么 AWK 不使用更多内存并且 awk 将其值存储在内存中的硬盘副上?
- 当 MySQL 必须逐行读取表格时,为什么它的速度如此之快?
- 是否有更有效的替代方法来聚合这些数据?