现在有一张聚合表,有2个value列
metric_value 列 设置为 decimal(32,4) sum null default "0.00"
distinct_value 列设置为 bitmap bitmap_union not null default bitmap_empty,放进去的值为long(Bigint)类型的uid
表中有1300多条数据,
查询sql类似
select
stat_time,
sum(if(m.metric_code = 'win_lose_amt', m.metric_value, 0)) as win_lose_amt,
bitmap_union_count (if(m.metric_code = 'active_user_cnt', m.distinct_value, null)) as active_user_cnt,
bitmap_union_count (if(m.metric_code = 'bet_user_cnt', m.distinct_value, null)) as bet_user_cnt
from table as m
where m.metric_code in ('win_lose_amt', 'active_user_cnt', 'bet_user_cnt')
group stat_time
order by stat_time
这个sql在聚合前,where条件能筛选出136条数据,其中
metric_code = 'win_lose_amt'的占2条
metric_code = 'active_user_cnt'的占132条(每条数据的distinct_value字段里大概有1400多个id),
metric_code = 'bet_user_cnt'的占2条(每条数据的distinct_value字段里只有1个id)
聚合后的结果如下:
stat_time win_lose_amt active_user_cnt bet_user_cnt
2025-08-03 00:00:00 0.0000 45942 0
2025-08-02 00:00:00 0.0000 84222 0
2025-08-01 00:00:00 -167.8000 21775 2
2025-07-31 00:00:00 0.0000 67781 0
查询结果是对的,但是查询耗时却花了900多毫秒,这不符合我对bitmap精确去重性能的预期;
当我将 active_user_cnt、bet_user_cnt 的查询列去掉后,sql查询只需要几十毫秒,说明耗时不是在检索上,而是在bitmap_union_count上;
当我将 active_user_cnt 的每条数据 distinct_value 字段里的元素数量控制在800~1000以内,sql的耗时能稳定在330毫秒左右;
当我单查 active_user_cnt 的132条数据进行bitmap_union_count时,耗时依然需要900多毫秒;
请问,bitmap_union_count 会受每行数据的distinct_value里的元素数量的多少影响吗?如果是的话,那官网文档里是如何做到描述中的海量数据下的精确去重的?
还是说是我的用法不对呢,希望大佬们解个惑