在clickhouse里面我们在创建表的时候需要根据order by字段进行排序,例如:
create table xxx( )engine = engine=MergeTree() order by a,b,c
此时整张表的数据按照a,b,c的顺序进行排序。当查询的时候,我们使用where a = xxx和where b =xxxx 和where c = xxxx分别来查询一下,可以看到:
where a = xxx(速度最快) where b = xxx(速度比a慢) where c = xxx(速度比a,b慢)
那此时确实又查询c的需求,并且又要求查询速度很快怎么办呢?这里的话就要使用到clickhouse的Projection投影了。这里的Projection投影的作用就是使用物化视图的方式,单独为一列数据创建一份单独的索引,然后查询的时候走这里的索引就可以了。是不是很方便?下面我们来演示一下:
1)准备数据
这里我们首先创建一张表,然后准备一些数据,示例如下:
--创建普通表 create table users( id UInt8, name String, age UInt8 ) engine=MergeTree() order by id; --插入数据 insert into users values(1,'张三EF42E43ab1B91374fBaFa5Cb6750eC96',10); insert into users values(2,'张三cE42Ac59816ab1A7afFF01aDDaE1Cb24',11); insert into users values(3,'张三216c2434063A7634E9aC64D7465751c4',12); insert into users values(4,'张三67ED8e627Baa71E60d13227a8E4141A7',13); insert into users values(5,'张三b04F49e061F1D8D941c08E6C09e35669',14); insert into users values(6,'张三209014eF5d519D8F9E9AB107D554E96b',15); insert into users values(7,'张三9d9F8B388b0b16c38a5dAFC203EC3Ae1',16); insert into users values(8,'张三02b1be0d48924c327124732726097157',17); insert into users values(9,'张三CaF1a3dfB505fFEd0D024130f58C5cfA',18); insert into users values(10,'张三8277E0910d750195b448797616E091aD',19); insert into users values(11,'张三225d72dE0494d5Ae03350BA23A0AAb68',20); insert into users values(12,'张三C12e01f2a13ff5587e1E9E4AEDb8242d',21); insert into users values(13,'张三E7BCC6E091b8D20Ed1217032325E74dc',22); insert into users values(14,'张三8277e0910d750195b448797616e091aD',23); insert into users values(15,'张三FF1cCF57E98c817DF1EFcD9fe44A8Aeb',24); insert into users values(16,'张三c20AD4D76FE97759aa27A0C99BFf6710',25); insert into users values(17,'张三3C59Dc048E8850243bE8079A5C74d079',26); insert into users values(18,'张三eCcbc87E4B5Ce2FE28308fd9f2A7bAF3',27); insert into users values(19,'张三979D472a84804b9F647bC185a877a8B5',28); insert into users values(20,'张三b70558e2AbbfADDf00CcDA51DC31Cf23',29); insert into users values(21,'张三4A8A08F09d37b73795649038408b5f33',30); insert into users values(22,'张三D54185B71f614c30a396AC4bC44d3269',31); insert into users values(23,'张三06002AF4aE19Dda3DE554C3619b866a9',32); insert into users values(24,'张三006D2143154327A64D86A264aEA225f3',33); --查询所有数据 select * from users;
这里准备的数据如下:
2)查询数据
这里为了演示效果,所以我们使用clickhouse-client来演示下:
#首先连接进去 clickhouse-client #设置日志级别 SET send_logs_level='trace'; #查询某条数据: select * from users where name = '张三FF1cCF57E98c817DF1EFcD9fe44A8Aeb';
这里可以看到他扫描了所有行,示例图如下:
3)创建project投影
这里创建投影的话,首先在表级别创建字段的投影,order by的字段填写自己想要添加排序索引的字段,例如:
ALTER TABLE users ADD PROJECTION p1 ( SELECT name,id,age ORDER BY name )
这里可以看到执行成功了:
然后需要把投影转换为物化视图:
ALTER TABLE users MATERIALIZE PROJECTION p1;
接着我们去看看当前users表的物化视图:
select * from system.mutations where table = 'users'
这里所有的物化视图表元数据都是保存在system.mutations表的,都可以从这里看到。
4)使用投影查询
接下来我们就使用投影进行查询,首先需要开启投影:
SET allow_experimental_projection_optimization = 1;
接着我们按照原来的sql进行查询:
select name,id,age from users where name = '张三FF1cCF57E98c817DF1EFcD9fe44A8Aeb';
这样就可以了。
最后关于clickhouse的投影可参考这篇文章做下演示演示:<Project投影>
还没有评论,来说两句吧...