• 设为首页
  • 收藏本站
  • 积分充值
  • VIP赞助
  • 手机版
  • 微博
  • 微信
    微信公众号 添加方式:
    1:搜索微信号(888888
    2:扫描左侧二维码
  • 快捷导航
    福建二哥 门户 查看主题

    StarRocks索引详解(最新整理)

    发布者: 姬7089 | 发布时间: 2025-6-20 07:45| 查看数: 130| 评论数: 0|帖子模式

    1. 主键索引(Primary Key Index)


    • 原理: 主键索引基于数据的物理排序存储。在StarRocks中,定义了主键的表,其数据将会按照主键字段的值进行有序排列。这不仅提供了唯一性约束,还确保了基于主键的查询能够通过跳跃列表或类似的数据结构快速定位记录。


    • 案例: 假设有一个用户行为表
      1. user_action
      复制代码
      ,其主键定义为
      1. (user_id, action_time)
      复制代码
      ,这意味着StarRocks会自动为主键字段创建索引,并按照这两个字段的组合进行排序存储。当执行如下的查询时,主键索引能高效工作:
    1. -- 创建表时指定主键
    2. CREATE TABLE user_data (
    3.     user_id INT NOT NULL,
    4.     name STRING,
    5.     gender ENUM('Male', 'Female'),
    6.     registration_date DATE,
    7.     PRIMARY KEY (user_id)
    8. ) ENGINE=OLAP
    9. DUPLICATE KEY(user_id)
    10. DISTRIBUTED BY HASH(user_id) BUCKETS 100;
    复制代码
    1. SELECT * FROM user_data WHERE user_id = 123;
    复制代码
    2. 前缀索引(Prefix Index / ShortKey Index)


    • 原理: 对于复合键的一部分或者字符串类型列的前几个字符,可以创建前缀索引以减少索引空间占用并优化某些查询。例如,对一个长字符串的前N个字符建立索引,可用于匹配开头的部分关键字。


    • 案例: 如果表的排序键是
      1. (country_code, user_id)
      复制代码
      ,并且
      1. country_code
      复制代码
      是一个低基数列(如国家代码),则StarRocks会自动构建前缀索引。当查询涉及
      1. country_code
      复制代码
      时,例如:
    1. SELECT * FROM user_table WHERE country_code = 'CN';
    复制代码
    1. -- 案例: 假设有一个手机号码列 phone_number,并且经常按区号进行查询,可以创建前缀索引:
    2. CREATE TABLE users (
    3.     ...
    4.     phone_number VARCHAR(20),
    5.     INDEX idx_phone_number (phone_number(7)) -- 前7位区号索引
    6. );
    7. -- 使用前缀索引案例
    8. SELECT * FROM users WHERE phone_number LIKE '010%';
    复制代码
    3. Bitmap 索引


    • 原理: Bitmap索引特别适用于高度离散且基数较低的列,如性别、地区等类别属性。它将每个独特的值映射到一个位图上,其中每一位代表一行数据是否包含该值。当多个位图需要进行交集、并集等操作时,只需对位图进行逻辑运算,从而实现高效的集合运算查询。


    • 案例: 假设有一个性别列
      1. gender
      复制代码
      ,且它的值只有两个状态(男/女)。若要快速统计男女用户数量,可以为
      1. gender
      复制代码
      列创建 Bitmap 索引。查询如下:
    1. CREATE BITMAP INDEX idx_gender ON example_table(gender);
    复制代码
    1. SELECT COUNT(*) FROM user_data WHERE gender = 'Female';
    复制代码
    4. Bloomfilter 索引


    • 案例: 在高基数列(如订单ID)上使用Bloomfilter索引可以帮助快速排除那些肯定不存在所查找值的数据块,减少不必要的数据读取。例如:
    • 假设我们有一个名为
      1. users
      复制代码
      的表,其中包含
      1. id
      复制代码
      1. name
      复制代码
      两个字段,我们想在
      1. id
      复制代码
      字段上创建一个布隆过滤器:
    1. CREATE TABLE users (  
    2.     id BIGINT COMMENT '用户ID',  
    3.     name STRING COMMENT '用户名'  
    4. ) ENGINE=OLAP  
    5. DUPLICATE KEY(id)  
    6. COMMENT '用户表'  
    7. PROPERTIES (  
    8.     "bloom_filter_columns" = "id"  
    9. );
    复制代码
    1. -- 向 users 表中插入一些数据:
    2. INSERT INTO users (id, name) VALUES (1, 'Alice');  
    3. INSERT INTO users (id, name) VALUES (2, 'Bob');  
    4. INSERT INTO users (id, name) VALUES (3, 'Charlie');
    复制代码
    1. SELECT * FROM users WHERE id = 4;
    复制代码
    由于我们在
    1. id
    复制代码
    字段上创建了布隆过滤器,StarRocks 可以先检查布隆过滤器来判断
    1. id
    复制代码
    为 4 的记录是否可能不存在。如果布隆过滤器判断该
    1. id
    复制代码
    不存在,那么 StarRocks 可以直接返回空结果,而无需进一步扫描表或索引。
    需要注意的是,布隆过滤器只能用于减少不必要的查询操作,而不能保证查询结果的准确性。因此,即使布隆过滤器判断某个
    1. id
    复制代码
    可能存在,我们仍然需要扫描表或索引来确认该
    1. id
    复制代码
    是否真的存在。
    此外,布隆过滤器的误报率取决于其配置和使用的位数组大小。在实际应用中,我们需要根据数据的特性和查询需求来合理配置布隆过滤器,以达到最佳的查询性能和准确性。
    案例2:假设我们有一个名为
    1. users
    复制代码
    的表,其中有一个
    1. email
    复制代码
    字段,我们想要在这个字段上创建一个布隆过滤器:
    1. CREATE TABLE users (  
    2.     id INT,  
    3.     email VARCHAR(255),  
    4.     name VARCHAR(255),  
    5.     age INT,  
    6.     INDEX idx_email_bloom (email) USING BLOOM_FILTER COMMENT 'Bloom filter on email'  
    7. ) DISTRIBUTED BY HASH(id) BUCKETS 10;
    复制代码
    1. INSERT INTO users (id, email, name, age) VALUES (1, 'user1@example.com', 'User One', 30);  
    2. INSERT INTO users (id, email, name, age) VALUES (2, 'user2@example.com', 'User Two', 25);  
    3. -- 插入更多数据...
    复制代码
    1. SELECT * FROM users WHERE email LIKE 'user%';
    复制代码
    到此这篇关于StarRocks索引详解的文章就介绍到这了,更多相关StarRocks索引内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

    来源:https://www.jb51.net/database/3373260i1.htm
    免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

    最新评论

    浏览过的版块

    QQ Archiver 手机版 小黑屋 福建二哥 ( 闽ICP备2022004717号|闽公网安备35052402000345号 )

    Powered by Discuz! X3.5 © 2001-2023

    快速回复 返回顶部 返回列表