全部產品
Search
文件中心

E-MapReduce:表設計

更新時間:Aug 14, 2025

表是資料存放區單元。理解StarRocks中的表結構,以及如何設計合理的表結構,有利於最佳化資料群組織,提高查詢效率。相比於傳統的資料庫,StarRocks會以列的方式儲存JSON、ARRAY等複雜的半結構化資料,保證高效查詢。本文詳細介紹StarRocks表結構,協助您深入瞭解表結構,根據情境設計高效的資料管理結構。

表結構

與其他關係型資料庫一樣,StarRocks表在邏輯上由行(Row)和列(Column)構成:

  • 行:每一行代表一條記錄,包含了一組相關聯的資料。

  • 列:列定義了一條記錄所包含的屬性。每一列代表了特定屬性的資料,例如,一個員工表可能包含姓名、工號、部門、薪水等列,每一列儲存對應的資料,每列資料具有相同的資料類型。所有行的列數相同。

StarRocks中建表操作簡單易用,您只需要在CREATE TABLE語句中定義列和列的資料類型,即可建立一張表。

CREATE DATABASE example_db;

USE example_db;

CREATE TABLE user_access (
    uid int,
    name varchar(64),
    age int, 
    phone varchar(16),
    last_access datetime,
    credits double
)
ORDER BY (uid, name);

上述建表示例建立了明細表,該表中資料不具有任何約束,相同的資料行可能會重複存在。並且指定明細表中前兩列為排序列,構成排序鍵。資料按排序鍵排序後儲存,有助於查詢時的快速索引。

  • 查看錶結構

    DESCRIBE user_access;

    返回資訊如下所示。

    image

  • 查看建表語句

    SHOW CREATE TABLE user_access;

表類型

StarRocks提供四種類型的表,包括明細表、主鍵表、彙總表和更新表,適用於儲存多種業務資料,例如未經處理資料、即時頻繁更新的資料和彙總資料。

  • 明細表:簡單易用,表中資料不具有任何約束,相同的資料行可以重複存在。該表適用於儲存不需要約束和預彙總的未經處理資料,例如日誌等。

  • 主鍵表:能力強大,具有唯一性非空約束。該表能夠在支撐即時更新、部分列更新等情境的同時,保證查詢效能,適用於即時查詢。

  • 彙總表:適用於儲存預彙總後的資料,可以降低彙總查詢時所需掃描和計算的資料量,極大提高彙總查詢的效率。

  • 更新表:適用於即時更新的業務情境,目前已逐漸被主鍵表取代。

資料分布

StarRocks採用分區+分桶的兩級資料分布策略,將資料均勻分布各個BE節點。查詢時能夠有效裁剪資料掃描量,最大限度地利用叢集的並發效能,從而提升查詢效能。

分區

第一層級為分區。表中資料可以根據分區列(通常是時間和日期)分成一個個更小的資料管理單元。查詢時,通過分區裁剪,可以減少掃描的資料量,顯著最佳化查詢效能。

StarRocks提供簡單易用的分區方式,即運算式分區。此外還提供較靈活的分區方式,即Range分區和List分區。

分桶

第二層級為分桶。同一個分區中的資料通過分桶,劃分成更小的資料管理單元。並且分桶以多副本形式(預設為3)均勻分布在BE節點上,保證資料的高可用。

StarRocks提供兩種分桶方式:

  • 雜湊分桶:根據資料的分桶索引值,將資料劃分至分桶。選取查詢時經常使用的條件列組成分桶鍵,能有效提高查詢效率。

  • 隨機分桶:隨機劃分資料至分桶。這種分桶方式更加簡單易用。

資料類型

除了基本的資料類型,如數值、日期和字串類型,StarRocks 還支援複雜的半結構化資料類型,包括 ARRAY、JSON、MAP、STRUCT。

索引

索引是一種特殊的資料結構,相當於資料的目錄。查詢條件命中索引列時,StarRocks能夠快速定位到滿足條件的資料的位置。

StarRocks 提供內建索引,包括首碼索引、Ordinal 索引和 ZoneMap 索引。也支援使用者手動建立索引,以提高查詢效率,包括Bitmap 和 Bloom Filter索引。索引詳情,請參見索引

約束

約束用於確保資料的完整性、一致性和準確性。主鍵表的Primary Key列具有唯一非空約束,彙總表的Aggregate Key列和更新表的Unique Key列具有唯一約束。

暫存資料表

在處理資料時,您可能需要儲存中間計算結果以便後續複用。先前版本中,StarRocks僅支援在單個查詢內利用CTE(通用資料表運算式)來定義臨時計算結果。然而,CTE僅是邏輯概念,不會在物理上儲存計算結果,且無法在不同查詢間共用,存在一定局限性。如果您選擇自行建立表來儲存中間結果,需要自我維護表的生命週期,使用成本較高。

為瞭解決上述問題,StarRocks在v3.3.1中引入了暫存資料表。暫存資料表允許您將臨時資料暫存在表中(例如ETL計算的中間結果),其生命週期與Session綁定,並由StarRocks管理。Session結束時,暫存資料表會被自動清除。暫存資料表僅在當前Session內可見,不同的Session內可以建立同名的暫存資料表。

使用暫存資料表

您可以在以下SQL語句中添加TEMPORARY關鍵字建立或刪除暫存資料表:

  • CREATE TABLE

  • CREATE TABLE AS SELECT

  • CREATE TABLE LIKE

  • DROP TABLE

說明
  • 與其他類型的內表類似,暫存資料表必須在屬於Default Catalog內的特定Database下建立。但由於暫存資料表基於Session,因此命名時不受唯一性限制式。您可以在不同Session中建立同名暫存資料表,或建立與其他內表同名的暫存資料表。

  • 如果同一Database中同時存在同名的暫存資料表和非暫存資料表,暫存資料表具有最高訪問優先順序。在該Session內,所有針對同名表的查詢和操作僅對暫存資料表生效。

使用限制

暫存資料表的使用方式與普通內表基本相同,但存在一些限制和差異:

  • 暫存資料表必須建立在Default Catalog中。

  • 不支援設定Colocate Group,若建表時顯式指定了colocate_with屬性,該屬性將被忽略。

  • 建表時ENGINE必須指定為olap

  • 不支援ALTER TABLE語句。

  • 不支援基於暫存資料表建立視圖和物化視圖。

  • 不支援EXPORT語句匯出。

  • 不支援SELECT INTO OUTFILE語句匯出。

  • 不支援基於暫存資料表通過SUBMIT TASK語句提交非同步任務。

更多特性

除了上述常用的特性之外,您還可以根據業務需求使用更多的特性,設計更加健壯的表結構,例如通過Bitmap和HLL列來加速去重計數,指定產生列或者自增列來加速部分查詢,配置靈活的資料自動降冷策略來降低營運成本,以及配置Colocate Join來加速多表JOIN查詢。