ClickHouse 中各种索引的使用依据你是如何决策的?

1 个回答

  • 卢璐说
    能治愈生活的良方,是保持对生活的热爱。
    以下是电商场景下,ClickHouse 中各种索引的使用依据与具体示例: ## 一、主索引(排序键,ORDER BY) **适用场景:** - 按日期或订单号等常规范围进行查询的场景(日期范围分析、订单详情查询、用户行为分析)。 **示例:** ```sql CREATE TABLE orders ( order_date Date, order_id UInt64, user_id UInt64, product_id UInt64, price Decimal(10,2) ) ENGINE = MergeTree() ORDER BY (order_date, order_id); ``` - 例如查询某一天或某一段日期内订单详情: ```sql SELECT * FROM orders WHERE order_date = '2025-03-20'; ``` ## 二、MinMax索引(区间查询) **适用场景:** - 涉及数值区间、时间区间的过滤条件,如价格范围、订单金额、销量范围查询。 **示例:** ```sql ALTER TABLE orders ADD INDEX idx_price_minmax (price) TYPE minmax GRANULARITY 4; ``` - 查询价格在100~500元之间的订单: ```sql SELECT * FROM orders WHERE price BETWEEN 100 AND 500; ``` ## 三、布隆过滤器索引(精确匹配) **适用场景:** - 精确匹配特定状态或维度(状态码、支付方式、地区等),字段的基数通常中低。 **示例:** ```sql ALTER TABLE orders ADD INDEX idx_status_bloom (order_status) TYPE bloom_filter GRANULARITY 4; ``` - 查询订单状态为“已支付”的数据: ```sql SELECT * FROM orders WHERE order_status = 'paid'; ``` ## 四、Set索引(集合过滤) **适用场景:** - 字段包含多个特征值(如标签、商品类别列表),且经常进行集合内查找,例如活动标签、商品属性。 **示例:** ```sql ALTER TABLE products ADD INDEX idx_tags_set (tags) TYPE set(0) GRANULARITY 4; ``` - 查询带有特定促销标签的商品: ```sql SELECT * FROM products WHERE has(tags, '促销'); ``` ## 五、Ngram索引或Token索引(模糊匹配搜索) **适用场景:** - 对商品名、用户评价、搜索关键字等模糊搜索或分词搜索的情况。 **示例:** ```sql ALTER TABLE products ADD INDEX idx_name_ngram (product_name) TYPE ngrambf_v1(3, 256, 2, 0) GRANULARITY 4; ``` - 模糊搜索包含关键字“手机”的商品: ```sql SELECT * FROM products WHERE product_name LIKE '%手机%'; ``` ## 电商常见场景快速总结: | 查询场景 | 推荐索引类型 | 典型字段 | |--------------------------|--------------------------------------|--------------------------------| | 按日期范围查询订单 | ORDER BY (主索引) | 日期(order_date) | | 按价格区间查询商品或订单 | MinMax索引 | 价格(price) | | 按订单状态、支付方式查询 | 布隆过滤器索引 | 订单状态、支付状态 | | 按商品标签或特征查询 | Set索引 | 标签(tags) | | 商品名称或评价模糊搜索 | Ngram或Token索引 | 商品名称(product_name) | 以上为电商场景下各种索引的使用依据,核心原则是: **精准匹配(低基数)用布隆过滤器,高效区间查询用MinMax,模糊搜索用Ngram/Token,集合过滤用Set索引,日常常用维度则设置为主索引。**
    发布于 2025-03-18 17:30 •IP属地 宁夏
    举报
    评论
    收藏