CREATETABLEIFNOTEXISTSsession_states(app_nameString,user_idString,session_idString,stateJSONCOMMENT'Session state in JSON format',extra_dataJSONCOMMENT'Additional metadata',created_atDateTime64(6),updated_atDateTime64(6),expires_atNullable(DateTime64(6))COMMENT'Expiration time (application-level)',deleted_atNullable(DateTime64(6))COMMENT'Soft delete timestamp')ENGINE=ReplacingMergeTree(updated_at)PARTITIONBY(app_name,cityHash64(user_id)%64)ORDERBY(app_name,user_id,session_id)SETTINGSallow_nullable_key=1COMMENT'Session states table';
CREATETABLEIFNOTEXISTSsession_events(app_nameString,user_idString,session_idString,event_idString,eventJSONCOMMENT'Event data in JSON format',extra_dataJSONCOMMENT'Additional metadata',created_atDateTime64(6),updated_atDateTime64(6),expires_atNullable(DateTime64(6))COMMENT'Reserved for future use',deleted_atNullable(DateTime64(6))COMMENT'Soft delete timestamp')ENGINE=ReplacingMergeTree(updated_at)PARTITIONBY(app_name,cityHash64(user_id)%64)ORDERBY(app_name,user_id,session_id,event_id)SETTINGSallow_nullable_key=1COMMENT'Session events table';
CREATETABLEIFNOTEXISTSsession_summaries(app_nameString,user_idString,session_idString,filter_keyStringCOMMENT'Filter key for multiple summaries per session',summaryJSONCOMMENT'Summary data in JSON format',created_atDateTime64(6),updated_atDateTime64(6),expires_atNullable(DateTime64(6))COMMENT'Reserved for future use',deleted_atNullable(DateTime64(6))COMMENT'Soft delete timestamp')ENGINE=ReplacingMergeTree(updated_at)PARTITIONBY(app_name,cityHash64(user_id)%64)ORDERBY(app_name,user_id,session_id,filter_key)SETTINGSallow_nullable_key=1COMMENT'Session summaries table';
CREATETABLEIFNOTEXISTSapp_states(app_nameString,keyStringCOMMENT'State key',valueStringCOMMENT'State value',updated_atDateTime64(6),expires_atNullable(DateTime64(6))COMMENT'Expiration time (application-level)',deleted_atNullable(DateTime64(6))COMMENT'Soft delete timestamp')ENGINE=ReplacingMergeTree(updated_at)PARTITIONBYapp_nameORDERBY(app_name,key)SETTINGSallow_nullable_key=1COMMENT'Application states table';
CREATETABLEIFNOTEXISTSuser_states(app_nameString,user_idString,keyStringCOMMENT'State key',valueStringCOMMENT'State value',updated_atDateTime64(6),expires_atNullable(DateTime64(6))COMMENT'Expiration time (application-level)',deleted_atNullable(DateTime64(6))COMMENT'Soft delete timestamp')ENGINE=ReplacingMergeTree(updated_at)PARTITIONBY(app_name,cityHash64(user_id)%64)ORDERBY(app_name,user_id,key)SETTINGSallow_nullable_key=1COMMENT'User states table';
使用场景
场景
推荐配置
海量日志存储
启用批量写入、配置合理的 BatchSize
高并发写入
启用异步持久化、增加 worker 数量
数据分析
使用 ClickHouse 原生查询能力
长期数据保留
使用 ClickHouse 表级 TTL
注意事项
ClickHouse 版本:需要 ClickHouse 22.3+ 以支持 JSON 类型
ReplacingMergeTree:数据更新通过插入新记录实现,后台自动合并去重
FINAL 查询:读取时使用 FINAL 确保一致性,但可能影响性能
软删除清理:WithDeletedRetention 使用 ALTER TABLE DELETE,对大数据集可能有性能影响,建议使用 ClickHouse Native TTL