ClickHouse使用MySQL实现字典查询
创始人
2025-05-30 07:36:02
0

字典是ClickHouse高效动态丰富数据的强大方法, 字典将标识符与之对应的附加属性映射到一起。字典数据存储在内存中,从而可以极大地提升查询性能。MySQL为实现通用业务的流行数据库,本文介绍ClickHouse如何使用MySql表实现字典功能。

ClickHouse字典

ClickHouse外部字典是内存键值对结构,用于代替SQL中join查询。ClickHouse支持多表联合查询,字典是实现高效多表查询的解决方案。字典可以连接外部数据源,如:ClickHouse,MySQL,或通用ODBC,文件或web服务。ClickHouse可以自动刷新外部数据源字典至最新状态,避免了繁琐的ETL过程,实现低延迟、高性能查询应用。

在ClickHouse 20.1版本开始支持DDL(CREATE DICTIONARY)方式定义字典,不再需要XML编辑字典。已定义字典可通过SHOW DICTIONARIESSHOW CREATE DICTIONARY ndict语句进行检查。也可以使用ON CLUSTER语法在集群节点上创建。

字典虽然是内存表,但不要通过join一起使用,而是通过字典函数才能发挥其优势。
如:dictGet(‘default.ndict’, ‘third_column’, number) ,还有其他几个重载函数,用于赋默认值:

dictGet('dict_name', attr_names, id_expr)
dictGetOrDefault('dict_name', attr_names, id_expr, default_value_expr)
dictGetOrNull('dict_name', attr_name, id_expr)

下面通过一个完整示例进行说明。

ClickHouse 事实表

假设ClickHouse中有一个事实表,事件源,包括id、发生日期和度量值。

创建表语句如下:

CREATE TABLE log
(`user_id` UInt64,`datetime` Datetime,`value` UInt32
)
ENGINE = MergeTree
ORDER BY datetime

这里 user_id 为用户ID,用户其他属性存储在MySQL中。

MySQL 维度表

这里使用简单的表进行示例:

CREATE TABLE `names` (`id` SERIAL PRIMARY KEY,`name` char(3) DEFAULT NULL
)

用户仅包括name属性,id与ClickHouse中user_id对应。下面介绍如何从ClickHouse中获取MySQL数据。

字典实现机制

显然,我们需要从MySQL移动数据到ClickHouse,然后关联查询log表,从而获得所有必要的属性。ClickHouse提供了简单方式实现:我们可以创建MYSQL引擎表,可以直接引用MySQL数据库中的表,然后在ClickHouse中进行连接查询。

但可以使用ClickHouse中的字典表实现,因为字典在内存中加载数据,查询效率更高。从技术上讲,字典的创建和使用包括以下几个步骤:

  1. 定义需要从中加载数据的数据源
  2. 调整设置,如缓存时间,确保更好的性能与数据相关性
  3. 从查询中直接通过函数获取字典数据

创建字典

上节已准备好Mysql表,下面在ClickHouse中创建字典:

CREATE DICTIONARY dict_users
(`id` UInt64,`name` String
)
PRIMARY KEY id
SOURCE(MYSQL(HOST '127.0.0.1' PORT 3306 USER 'test' PASSWORD 'test' DB 'test' TABLE 'names'))
LIFETIME(MIN 300 MAX 360)
LAYOUT(HASHED())

上面要求ClickHouse创建字典,名称为dict_users, 字典属性与MySql表属性一样。SOURCE块配置MySQL服务参数,HASHED()指定载入所有数据至内存hash表。因为MySql数据有可能改变,如有新增加的数据,因此使用lifetime块配置缓存参数。

ClickHouse在第一次使用字典时加载数据至字典(不是创建后加载),使用字典的语法如下:

SELECT dictGet('dict_names', 'name', 123)

首先从MySql加载所有数据至ClickHouse,然后返回id为123用户对应的name,其等效查询语句为:

SELECT name FROM names WHERE id = 123 -- equivalent Mysql query

为了检查字典占用内存情况,可以查询system表:

SELECT formatReadableSize(bytes_allocated)
FROM system.dictionaries
WHERE name = 'dict_users'

用户可以在httpUI中查询:http://localhost:8123/play, 返回结果:

formatReadableSize(bytes_allocated)
10.23 KiB

通常字典和ID属性一起丰富查询结果,log表没有name,使用字典进行转换:

SELECT dictGet('dict_users', 'name', user_id), datetime, val
FROM log WHERE ...

其他字典函数

dictHas(‘dict_name’, id_expr) : 检查id_expr在字典dict_name中是否存在

对于字典包括联合主键(多个字段联合作为主键)则使用dictGetString函数,语法如下:

dictGetString(‘dict_name’, ‘attr_name’, tuple(‘string for field1’, num_for_field2)).

总结

外部字典是ClickHouse的一等公民,是Schema的一部分,我们可以使用本地DDL或 ON CLUSTER语句进行创建。实现细节多用户是透明的,它自动转换join查询为字典调用,用户体验及查询性能都值得我们去学习和使用。外部字典还有其他类型,如层次、多边形等字典,未来继续学习并分享。

相关内容

热门资讯

快手2025一季度净利润下滑3... 运营商财经网 实习生郑永杰/文 近日,快手科技发布2025年第一季度财报。报告期内,公司实现营收32...
居然智家董事长汪林朋被曝坠楼身... 7月27日消息,家居行业头部企业居然智家、董事长汪林朋被曝跳楼身亡。经多位行业人士确认,证实了此消息...
“国补”继续!第三批690亿元... 近日,国家发展改革委已会同财政部,向地方下达了今年第三批690亿元超长期特别国债支持消费品以旧换新资...
港股午评:恒指涨0.4%科指跌... 7月28日消息,三大指数冲高回落。截至午间收盘,恒生指数涨0.4%,报25490.45点,恒生指数跌...
弘信电子:7月25日融券卖出6... 证券之星消息,7月25日,弘信电子(300657)融资买入1.12亿元,融资偿还1.66亿元,融资净...
东山精密:7月25日融资买入1... 证券之星消息,7月25日,东山精密(002384)融资买入1.46亿元,融资偿还2.36亿元,融资净...
A股2025年首只10倍股诞生 上纬新材早盘一度涨超16%,再创历史新高。 该股年内累计涨幅已到达10倍以上,成为A股2025年以...
魅族换帅!创始人亲弟黄质潘重掌... 瑞财经 吴文婷7月25日,据媒体报道,星纪魅族证实,黄质潘正式出任星纪魅族集团CEO。 与此同时,...
31省份“半年报”出炉!“中部... 文/刘文文 截至26日,31省份“半年报”已全部披露。梳理这份“成绩单”,中部地区出现一些有趣的新动...
居然智家董事长汪林朋被传坠亡?... 7月27日,上市家居企业居然智家董事长汪林朋被传出坠亡消息,27日晚,多名家居圈资深人士向南都湾财社...
山海:本周数据众多,耐心等待黄... 山海:本周数据众多,耐心等待黄金的多头延续! 上周黄金先涨后跌,整体略显弱势,虽然走出了一波下跌空...
医疗创新ETF:7月25日融资... 证券之星消息,7月25日,医疗创新ETF(516820)融资买入334.0万元,融资偿还626.25...
原创 7... 近些年,国内居民存款的热情越来越高涨。人们之所以爱存钱,主要原因是,把钱存在银行里面,可以应对失业、...
“十四五”期间全国累计新增减税... 国家税务总局局长胡静林28日在国新办新闻发布会上表示,“十四五”时期,国家出台了一系列减税降费政策,...
6月末银行理财市场存续超30万... 银行业理财登记托管中心7月25日发布的报告显示,截至今年6月末,银行理财市场存续规模达30.67万亿...
证监会再次修订《上市公司治理准... 7月25日晚上,证监会发布通知对《上市公司治理准则(修订征求意见稿)》公开征求意见。本次修订目的是为...
从“闭眼买”到“不敢信”,山姆... 蓝鲨导读:中国零售崛起 作者 | 张二河 编辑 | 卢旭成 山姆会员店,因上架了一款韩国品牌陷入舆论...
原创 欧... 近日,欧盟委员会突然宣布了一则令人震惊的消息:7月25日,该委员会正式对中国太阳能玻璃发起第二次双反...
7月28日财经早餐:欧美达成贸... 来源:市场资讯 汇通财经APP讯——周一(北京时间7月28日),现货黄金交投于3335.78美元/盎...
科技早报 | 贝索斯完成大规模... 贝索斯完成一轮大规模亚马逊股票出售,套现57亿美元 亚马逊公司当地时间7月25日提交至美国证券交易...