Clickhouse 是不是支持快速检索任何列?
Posted
技术标签:
【中文标题】Clickhouse 是不是支持快速检索任何列?【英文标题】:Does clickhouse support quick retrieval of any column?Clickhouse 是否支持快速检索任何列? 【发布时间】:2022-01-01 06:47:33 【问题描述】:我尝试使用clickhouse
存储40亿数据,部署在单机,48核cpu和256g内存,机械硬盘。
我的数据有十列,想通过SQL语句快速搜索任意一列,如:
select * from table where key='mykeyword'; or select * from table where school='Yale';
我使用order by
建立排序键,order by (key, school, ...)
但是当我搜索时,只有按键排序的第一个字段具有非常高的性能。搜索其他字段时,查询速度很慢甚至内存溢出(内存分配已经够大了)
那么请问各位高手,clickhouse
是否支持类似mysql
这样对每列索引的高性能搜索?我也尝试通过索引为每一列创建二级索引,但性能并没有提升。
【问题讨论】:
clickhouse 不适用于此类查询。试试 Cassandra。 @datagic,关于clickhouse,你必须了解的是,它旨在以非常快速的方式进行聚合/“复杂计算”,它按分区存储数据,并按某些列排序优化查询的存储。主要瓶颈是它将始终按照您在创建表时指定的 order by 子句提供的顺序读取完整分区。因此,如果您只需要通过在您想要的每一列上读取和过滤数据并且没有可用作分区的区分列,那么您就没有正确的用例。 但如果您设法按分区正确拆分它并设法在查询中读取较少的分区,它应该可以很好地完成工作。此外,如果您有内存溢出,则意味着您正在对其进行某种聚合,例如 group by/order by for ex。使用distributed_group_by_no_merge=0 的设置,它将在一个节点中收集所有数据以进行分组/排序。为了避免这种情况,您可以将此设置设置为 1,这将按分片进行聚合,或 2 可用于您的数据在分片之间没有冲突的情况。 【参考方案1】:您应该尝试了解稀疏主索引的工作原理 以及 CREATE TABLE 中正确的 ORDER BY 子句如何帮助您的查询性能。
Clickhouse 永远不会像 mysql 那样工作
尝试在 CREATE TABLE 语句中使用 PRIMARY KEY 和 ORDER BY 并在 PRIMARY KEY 的一阶上使用具有低值基数的字段 不要尝试使用 ALL
SELECT * ...
这真的是反模式
此外,也许二级数据跳过索引可能会对您有所帮助(但我不确定) https://clickhouse.com/docs/en/engines/table-engines/mergetree-family/mergetree/#table_engine-mergetree-data_skipping-indexes
【讨论】:
以上是关于Clickhouse 是不是支持快速检索任何列?的主要内容,如果未能解决你的问题,请参考以下文章