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查询为字典调用,用户体验及查询性能都值得我们去学习和使用。外部字典还有其他类型,如层次、多边形等字典,未来继续学习并分享。

相关内容

热门资讯

银行、消金公司助贷余额增速不得... 近日,中国证券报记者从多位业内人士处独家获悉,5月以来,多地金融监管部门对部分中小银行、消金公司下达...
朱鸿接任陈航,担任钉钉科技有限... 消费日报-今朝新闻讯 天眼查显示,6月23日,钉钉科技有限公司发生工商变更,陈航卸任法定代表人、董事...
3日累跌超20%,德创环保:公... 6月25日, 德创环保(603177.SH)公告,公司股票于2026年6月23日、6月24日和6月2...
北京发布2026年第七轮拟供商... 央广网北京6月25日消息(记者门庭婷)6月25日,北京市规划和自然资源委员会网站发布了2026年第七...
开放麦 | 启明创投胡奇:从A... “2026年,创投圈的浪潮再次翻涌:AI从技术概念走进产业深水区,硬科技创业从“小众赛道” 变成“主...
腾讯孙忠怀:在行业转身处 6月24日,2026腾讯视频年度发布在上海举行。腾讯公司副总裁、腾讯在线视频董事长孙忠怀以《在行业转...
加息,突变!美联储,重磅传来!... 美联储政策路径突生变数。 美国商务部经济分析局最新公布的数据显示,5月个人消费支出(PCE)物价指数...
6月合肥上门收金必看!5步避坑... 2026年6月,合肥黄金市场持续高位运行,不少市民翻出家里闲置的旧金饰、投资金条想变现,上门回收因为...
潮汕女富豪挂帅后加码液冷!祥鑫... 潮汕女强人,带着百亿公司加码液冷散热。 6月24日晚间,祥鑫科技(002965.SZ)公告称,公司董...
马斯克向太空要电,GobiX ... 一场关于「去哪里找电」的全球竞赛,正在朝两个方向展开。 作者|周永亮 编辑| 郑玄 「太空光伏是不是...
原料药行业陷入周期低谷 有药企... 每经记者|许立波 每经编辑|魏文艺 “过完年到现在,我们整个团队每个月都在出差,跑遍了亚非拉、欧美市...
家门口筛查白内障!永顺泽家镇暖... 大众卫生报·新湖南客户端6月25日讯(通讯员 彭雪姣)为切实解决辖区老年性白内障患者异地就医奔波、就...
终于等到!油价马上再大跌,这个... 点击添加图片描述(最多60个字) 编辑 各位车主朋友,好消息接二连三! 继6月18日油价大幅下调...
丈量出海新路 世界酒庄影响力指... 长期以来,全球酒庄评价体系由西方机构主导,且大多局限于单一酒种、单一评价维度,这一局面正逐渐被打破。...
峰瑞资本创始合伙人李丰:从资本... “2026年,创投圈的浪潮再次翻涌:AI从技术概念走进产业深水区,硬科技创业从“小众赛道” 变成“主...
原创 A... 迈向成熟,还有茁壮成长的机会。 作者 | 方璐 编辑丨于婞 来源 | 野马财经 2026年6月21日...
为企业解锁出海新通道!亚太中小... 6月24日下午,作为2026年APEC中小企业工商论坛的重要组成部分,亚太中小企业国际化合作发展论坛...
君赛生物港股IPO,增聘兴证国... 跟丰宜科技一样,正冲刺港股IPO的上海君赛生物股份有限公司(简称“君赛生物”)增聘一位整体协调人。 ...
圣邦股份明日上市:暗盘涨24%... 雷递网 雷建平 6月25日 圣邦微电子(北京)股份有限公司(简称:“圣邦股份”,股票代码:“0366...
科技“吃肉”,券商跟着“喝汤”... 当科技持续成为市场核心主线,押中硬科技项目的券商也成为被追逐的焦点。 6月24日,半导体零部件概念股...