当前位置: 首页 > 后端技术 > PHP

ClickHouse合并性能测试

时间:2023-03-29 22:35:26 PHP

ClickHouse性能测试为了验证ClickHouse的性能,将结合实际业务场景对clickHouse进行多维度测试。在实际业务中最常见的业务场景中创建测试数据。有两个表,订单主表和订单明细表。通常,将两个表连接起来进行查询或分组查询。下面将使用clickhouse来测试定义这种情况表结构test_order:主表表结构:CREATETABLE`test_order`(`id`bigint(11)NOTNULLAUTO_INCREMENT,`field_name_1`varchar(60)NOTNULL,`field_name_2`varchar(60)NOTNULL,`field_name_3`varchar(60)NOTNULL,`field_name_4`varchar(60)NOTNULL,`field_name_5`varchar(60)NOTNULL,`field_name_6`varchar(60)NOTNULL,`field_name_7`varchar(60)NOTNULL,`field_name_8`varchar(60)NOTNULL,`field_name_9`varchar(60)NOTNULL,`field_name_10`varchar(60)NOTNULL,`field_id_1`int(11)NOTNULL,`field_id_2`int(11)NOTNULL,`field_id_3`int(11)NOTNULL,`field_id_4`int(11)NOTNULL,`field_id_5`int(11)NOTNULL,`field_id_6`int(11)NOTNULL,`field_id_7`int(11)NOTNULL,`field_id_8`int(11)NOTNULL,`field_id_9`int(11)NOTNULL,`field_id_10`int(11)NOTNULL,`field_date_1`timestampNOTNULLDEFAULTCURRENT_TIMESTAMP,`field_date_2`timestampNOTNULLDEFAULTCURRENT_TIMESTAMP,`field_date_3`timestampNOTNULLDEFAULTCURRENT_TIMESTAMP,`field_date_4`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMP,`field_date_5`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMP,`field_date_6`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMP,`field_date_7`DEFAULTSTAMP日期时间NOTNOTNULLDEFAULTCURRENT_TIMESTAMP,`field_date_8`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMP,`field_date_9`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMP,PRIMARYKEY(`id`),KEY`idx_field_1`(`field_name_1`,`field_id_1`)USINGBTREE)ENGINE=InnoDBAUTO_INCREMENT=1043DEFAULTCHARSET=utf8mb4;test_order_detail:明细表,为了增加sql查询复杂的,确定了41个字节表结构CREATETABLE`test_order_detail`(`id`bigint(11)NOTNULLAUTO_INCREMENT,`order`bigint(1,1)NOTNULL`field_name_1`varchar(60)NOTNULL,`field_name_2`varchar(60)NOTNULL,`field_name_3`varchar(60)NOTNULL,`field_name_4`varchar(60)NOTNULL,`field_name_5`varchar(60)NOTNULL,`field_name_6`varchar(60)NOTNULL,`field_name_7`varchar(60)NOTNULL,`field_name_8`varchar(60)NOTNULL,`field_name_9`varchar(60)NOTNULL,`field_name_10`varchar(60)NOTNULL,`field_name_11`varchar(60)NOTNULL,`field_name_12`varchar(60)NOTNULL,`field_name_13`varchar(60)NOTNULL,`field_name_14`varchar(60)NOTNULL,`field_name_15`varchar(60)NOTNULL,`field_name_16`varchar(60)NOTNULL,`field_name_17`varchar(60)NOTNULL,`field_name_18`varchar(60)NOTNULL,`field_name_19`varchar(60)NOTNULL,`field_name_20`varchar(60)NOTNULL,`field_id_1`int(11)NOTNULL,`field_id_2`int(11)NOTNULL,`field_id_3`int(11)NOTNULL,`field_id_4`int(11)NOTNULL,`field_id_5`int(11)NOTNULL,`field_id_6`int(11)NOTNULL,`field_id_7`int(11)NOTNULL,`field_id_8`int(11)NOTNULL,`field_id_9`int(11)NOTNULL,`field_id_10`int(11)NOTNULL,`field_date_1`时间戳NOTNULLDEFAULTCURRENT_TIMESTAMP,`field_date_2`时间戳不是NULLDEFAULTCURRENT_TIMESTAMP,`field_date_3`时间戳不是NULLDEFAULTCURRENT_TIMESTAMP,`field_date_4`时间戳不是NULLDEFAULTCURRENT_TIMESTAMP,`field_date_5`时间戳不是NULLDEFAULTCURRENT_TIMESTAMP,`field_date_6`日期时间不是NULLDEFAULT`current_date_7,`field_date_TIMESTAMPdatetimeNOTNULLDEFAULTCURRENT_TIMESTAMP,`field_date_8`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMP,`field_date_9`datetimeNOTNULLDEFAULTCURRENT_TIMESTAMP,PRIMARYKEY(`id`),KEY`idx_order_id`(`order_id`)使用BTREE)ENGINE=InnoDBAUTO_INCREMENT=18129081默认字符集=utf8mb4;向mysqltest_order写入测试数据是主表,向test_order_detail表插入1024行数据是重头戏。这里批量写入了1800万行数据,每一列数据都是使用随机函数生成的。代码比较简单,所以没有显示mysql数据存放目录。.ibd文件是test_order_detail表的数据和索引文件内容。已经到了13G,数据量很大-rw-r-----@1教员14K81512:46test_order_detail.frm-rw-r-----@1教员13G81620:30test_order_detail.ibd将查询数据从mysql写入.csv使用clickhouse直接读取csV文件插入表features这里每次从mysql读取10万条数据写入csv文件生成180多个.csv文件?csvlltotal29852872-rw-r--r--1jiaostaff71M82118:101.csv-rw-r--r--1教员74M82118:1010.csv-rw-r--r--1教员78M82118:15100.csv-rw-r--r--1角员工78M82118:15101.csv-rw-r--r--1角员工78M82118:15102.csv-rw-r--r--1角staff78M82118:15103.csv-rw-r--r--1jiaostaff78M82118:15104.csv-rw-r--r--1jiaostaff78M82118:16105.csv-rw-r--r--1角员工78M82118:16106.csv-rw-r--r--1角员工78M82118:16107.csv-rw-r--r--1角员工78M82118:16108.csv-rw-r--r--1角员工78M82118:16109.csv-rw-r--r--1角员工75M82118:1011.csv-rw-r--r--1角员工78M82118:16110.csv-rw-r--r--1角员工78M82118:16111.csv-rw-r--r--1角员工78M82118:16112.csv-rw-r--r--1角员工78M82118:16113.csv-rw-r--r--1角员工78M82118:16114.csv-rw-r--r--1角员工78M82118:16115.csv-rw-r--r--1角员工78M82118:16116.csv-rw-r--r--1教员78M82118:16117.csv-rw-r--r--1教员78M82118:16118.csv-rw-r--r--1jiaostaff78M82118:17119.csv使用php将csv文件插入clickhouse安装php语言clickhouse第三方包:https://github.com/smi2/phpClickHouse第三方包使用http协议。首先在clickhouse中创建一个表CREATETABLEtest.test_order_detail(`id`Int64,`order_id`Int64,`field_name_1`String,`field_name_2`String,`field_name_3`String,`field_name_4`String,`field_name_5`String,`field_name_6`String,`field_name_7`String,`field_name_8`String,`field_name_9`String,`field_name_10`String,`field_name_11`String,`field_name_12`String,`field_name_13`String,`field_name_14`String,`field_name_15`String,`field_name_16`字符串,`field_name_17`字符串,`field_name_18`String,`field_name_19`String,`field_name_20`String,`field_id_1`Int64,`field_id_2`Int64,`field_id_3`Int64,`field_id_4`Int64,`field_id_5`Int64,`field_id_6`Int64,`field_id_7`Int64,`field_id_8`Int64,`field_id_9`Int64,`field_id_10`Int64,`field_date_1`DateTime,`field_date_2`DateTime,`field_date_3`DateTime,`field_date_4`DateTime,`field_date_5`DateTime,`field_date_6`DateTime,`field_date_7`DateTime,`field_date_8`DateTime,`field_date_9`DateTime)ENGINE=MergeTreeORDERBYidSETTINGSindex_granularity=8192执行脚本php脚本,代码比较简单单,部分代码如下$begin=microtime(true);$config=['host'=>'172.16.101.134','port'=>'8123','username'=>'caps','password'=>'123456'];$db=新客户端($config);$db->数据库('测试');$db->setTimeout(60);//10秒onds$db->setConnectTimeOut(50);//5秒//$tables=$db->showTables();//从csv插入$connect=microtime(true);对于($j=1;$j<=1;$j++){$file_data_names=[];对于($i=1;$i<=1;$i++){$file_data_names[]=__DIR__.DIRECTORY_SEPARATOR。'csv'。DIRECTORY_SEPARATOR。($j)。'.csv';}$db->insertBatchFiles('test_order_detail_tmp',$file_data_names);睡眠(1000);}echomicrotime(true)-$begin。PHP_EOL;echomicrotime(true)-$connect。PHP_EOL;insertdata性能测试表没有定义分区。每行数据都是随机生成的。总共有42列。每行的数据量约为0.8k。批量插入的行数取10000.05s0.7M10000.25s7.1M50001.0s36M1000002.0s73M203.6s146M在不同机器上的测试结果可能相差很大。从本机测试结果来看,每次插入数据适合1k-5w,可以保证1秒内成功插入数据时可能出现的错误1、如果设置了partitionkey,插入的数据会造成分区过多,导致插入失败。默认最大值为100个分区。2.插入数据过多导致内存溢出数据压缩率为1800万数据Mysql占用存储空间量:13GCClickHouse占用:4.1G由于所有字段都是随机生成的,3倍的数据压缩率已经非常高了高,而且lz4压缩算法的解压效率也很高查询性能测试test_order_detail表1800万条数据test_order表1000行数据下面测试业务中比较常用的sqlTest1selectcount(*)fromtest.test_order_detailtocount总条数,很普通的sql,ClickHouse把总条数保存在count.txt文件里,所以返回真快Mysql耗时ClickHouse耗时20s0.003sclieckhouseQueryresult1rowsinset.经过:0.003秒。test2selecta.order_id,sum(a.field_id_1),sum(a.field_id_2)fromtest.test_order_detailasajointest.test_orderasbona.order_id=b.idgroupbya.order_id;join表聚合数据这一层ofdatamysql不能再处理Mysql耗时的ClickHousetime--0.450sclieckhouse查询结果,因为都没有用到,扫描了全表,总共处理了1800万行数据,可以处理4000万行数据在没有第二个,效率很高。集合中有1042行。经过:0.450秒。处理了1813万行,435.11MB(4028万行/秒,966.66MB/秒)Test3从test.test_order_detail中选择a.order_id,sum(a.field_id_1),sum(a.field_id_2)作为连接test.test_order作为bona.order_id=b.idgroupbya.order_ID限制1,20;加个limit试试等了很久mysql还是没有返回结果mysql耗时ClickHousetime--0.574sclieckhouse查询结果set20行。经过:0.574秒。处理了1813万行,435.11MB(3160万行/秒,758.37MB/s)test4selectcount(*)fromtest.test_order_detail单表聚合数据等了很久mysql还是没有返回结果mysql耗时ClickHousetime--0.212clieckhousequeryresults)20rowsinset.经过:0.212秒。处理了1813万行,435.10MB(8563万行/秒,2.06GB/s.)综上所述,在数据量比较小,sql比较简单的情况下,mysql还是很方便的。但是在大数据场景下,mysql捉襟见肘。通过本文下面的简单测试,发现clickhouse非常适合大数据场景下的数据查询。使用列式存储和数据压缩特性,可以高效地处理数据。另外,SummingMergeTree、AggregatingMergeTree更高效地进行数据预聚合,有时间会分享更多内容