介绍
一个字典是一个映射 (key -> attributes) ,能够作为函数被用于查询。你可以认为它可以作为更便捷和高效的 JOIN 类型,作为维度表。
数据字典有两种,一个是内置字典,另一个是外置字典。
外部字典
当启动服务器时,字典能够被创建,或者初次使用。通过dictionaries_lazy_load参数被定义,在主服务器的配置文件中。这个参数是可选的,默认情况是’true’,每个字典初次使用时被创建。如果词典创建失败,正在使用词典的函数抛出一个异常。如果是’false’,当服务器启动时,所有的字典被创建,如果有一个错误,那么服务器将停机。
支持类型
dictionary.xml
1 | <comment>Optional element with any content; completely ignored.</comment> |
layout配置
有6种不同的方法在内存中存储字典。
flat
flat是最有效的方法。如果所有的 keys 小于500,000,它正常工作。如果一个更大的 key被发现,当创建一个字典,一个异常将抛出,此字典不会被创建。字典被整体加载进入到内存中。字典使用内存量与最大的 key value 相称。限制为500,000,内存消耗不会太高。所有类型的资源都被支持。当更新时,数据(文件或者表)被整体读取。
Hashed
此方法比第一个效果差一点。字典也被加载到内存中,能够包含任意的条目数量(带有任意 ID)。在实际情况下,它可以用到数百万个条目,如果有足够大的内存。所有源的类型都被支持。当更新时,数据(文件或者表)被整体读取。
Cache
最无效的方法. 如果字典不适合在内存,它是合适的. 它是确定数据槽位数量的缓存,可将频繁访问的数据放在这. MySQL, ClickHouse, Executable, HTTP 资源都被支持, 但是文件资源不被支持. 当在一个词典中搜索时, 缓存是第一个被搜索的. 对于每一个数据块, 所有的键没有在缓存中找到的 (或者已经超时) 被收集在一个包中, 被发送到带有查询的源端 SELECT attrs…FROM db.table WHERE id IN(k1,k2,…). 接收的数据被写入到缓存中.
Range_hashed
太复杂,先忽略。。
complex_key_hashed
对于复杂的 keys,与hashed是相同的,
complex_key_cache
对于复杂的 keys,与 cache 是相同的。
带有复杂Keys的字典
你能够使用tuples,由任意类型的数据域作为 keys 组成。配置你的字典-带有complex_key_hashed或者complex_key_cache配置。
Key 结构被配置不在
1 | <structure> |
当使用这些字典时, 使用 Tuple 域值作为 一个 key,在 dictGet* 函数中. Example:dictGetString(‘dict_name’,‘attr_name’,tuple(‘field1_value’,123)).
字典的使用
1 |
|
1 | dictGetT(‘dict_name’,‘attr_name’,tuple(ip)) |