1
qping 2022-11-10 09:42:09 +08:00
为什么要用 union 的形式, 而不是把用户数据代入到 sql 查询?
|
3
qping 2022-11-10 09:46:14 +08:00
SELECT * FROM A where value1 = '1' or ...... or value6 = '1'
和这样写有啥区别 |
4
qping 2022-11-10 09:48:32 +08:00
以我浅薄的 mysql 基础, 十分不靠谱的推断: 你那么写,会建 6 个临时表,对所有数据扫描 6 次,然后还要算上 union 去重的消耗
|
7
qping 2022-11-10 09:49:51 +08:00 1
没注意是 clickhouse ,打扰了
|
9
qping 2022-11-10 09:52:49 +08:00
你的场景,我猜是用户输入了一个东西,需要在 6 个字段都匹配,然后返回所有匹配的数据。
有试过 clickhouse 的跳表索引吗 |
11
lookStupiToForce 2022-11-10 10:21:11 +08:00 1
其他支持 array 字段类型 和 倒排索引 的数据库倒是有法子
就是把这六个列的数据当作一个 array 存起来,查的时候用倒排索引去查 1. add array column 2. set new_array_column = array[value1, value2, ..., value6] 3. select * from A where new_array_column @> array['1'] 这样只用查一次倒排索引就能解决问题,可以避免 union 查 6 次索引的开销,而且你题目中还要用 distinct 去重,也就是说要对六个结果集进行一次综合排序,这额外开销太大了。 不知道 clickhouse 支不支持上面说的两样关键东西[array 字段类型]和[倒排索引],支持的话就好办,不支持的话 op 你只能参照这个基本思想去聚合六个字段的内容到一个字段,自己想办法结合查询条件去实现这个字段怎么存内容了 |
12
ggex 2022-11-10 12:10:53 +08:00
查询字段有试过创建索引吗
|
13
wertxx77 2022-11-10 12:24:08 +08:00
同意楼上说的将 UNION 换成 OR 的形式。此外,ClickHouse 查询影响最大的还是组合主键的列顺序,建议将能过滤数据量大列的放在第一位。
|