在正式开始clickhouse探秘前,我们先抛出一个问题:影响OLAP查询速度的是什么?是优秀的算法么?不可否认,算法对查询性能的影响非常大,但到了现阶段通用的算法基本上已经能够达到很高的性能了。因此,在现阶段,制约着大数据OLAP查询速度的已经不再是算法了。那么这个问题的答案是什么呢?实践是检验整理的唯一标准,我们来做个实验看一下。
实验
我们写一段代码来模拟数据库执行SELECT max(id) From tbl_a这句语句。如果不考虑前面的sql解析过程,可以简单抽象成两个步骤:
- 从磁盘中读取数据文件,载入内存
- 解析数据并找出最大的id
// 从磁盘将文件载入内存
long s = System.nanoTime();
List<String> lines = FileUtils.readLines(file,"utf8");
long e1 = System.nanoTime();
System.out.println("文件读取完成,耗时:"+((e1-s)/1e6)+" ms,开始找最大值");
// 解析并求出最大值
String maxId = lines.parallelStream()
.map(e -> e.substring(0,e.indexOf(" ")).trim())
.max(Comparator.comparingInt(Integer::parseInt)).orElse("未找到");
long e2 = System.nanoTime();
// 计算每个阶段的耗时
System.out.println("计算完成,耗时:"+((e2-e1)/1e6)&#