创建表 #

一、表概述 #

1.1 什么是表 #

表(Table)是Cassandra中存储数据的基本单元,由行和列组成。

text
Cassandra表结构:

┌─────────────────────────────────────────────────────────┐
│                    users 表                              │
├─────────────┬─────────────┬─────────────┬───────────────┤
│ user_id(PK) │ name        │ email       │ created_at    │
├─────────────┼─────────────┼─────────────┼───────────────┤
│ uuid-001    │ 张三        │ zhang@ex.com│ 2024-01-01    │
│ uuid-002    │ 李四        │ li@ex.com   │ 2024-01-02    │
│ uuid-003    │ 王五        │ wang@ex.com │ 2024-01-03    │
└─────────────┴─────────────┴─────────────┴───────────────┘

1.2 表的特点 #

特点 描述
宽表模型 每行可以有不同的列
无模式 添加列不需要修改现有数据
分区存储 数据按分区键分布到不同节点
有序存储 分区内按聚簇列排序

二、CREATE TABLE语法 #

2.1 基本语法 #

sql
CREATE TABLE [IF NOT EXISTS] [keyspace_name.]table_name (
    column_name data_type [PRIMARY KEY],
    column_name data_type,
    ...
    [, PRIMARY KEY (column_name, ...)]
)
[WITH table_options];

2.2 参数说明 #

参数 描述
IF NOT EXISTS 表不存在时才创建
keyspace_name 键空间名称
table_name 表名称
column_name 列名称
data_type 数据类型
PRIMARY KEY 主键定义
table_options 表属性

三、基本创建示例 #

3.1 简单表 #

sql
-- 创建简单用户表
CREATE TABLE users (
    user_id UUID PRIMARY KEY,
    name TEXT,
    email TEXT,
    age INT,
    created_at TIMESTAMP
);

-- 使用IF NOT EXISTS
CREATE TABLE IF NOT EXISTS users (
    user_id UUID PRIMARY KEY,
    name TEXT,
    email TEXT
);

3.2 复合主键表 #

sql
-- 创建订单表(分区键+聚簇列)
CREATE TABLE orders (
    user_id UUID,
    order_id UUID,
    order_date TIMESTAMP,
    amount DECIMAL,
    status TEXT,
    PRIMARY KEY (user_id, order_id)
);

-- 创建时间序列表
CREATE TABLE events (
    device_id TEXT,
    event_time TIMESTAMP,
    event_type TEXT,
    event_data TEXT,
    PRIMARY KEY (device_id, event_time)
) WITH CLUSTERING ORDER BY (event_time DESC);

3.3 复合分区键表 #

sql
-- 创建复合分区键表
CREATE TABLE sensor_data (
    sensor_id TEXT,
    date DATE,
    hour INT,
    reading_time TIMESTAMP,
    value DOUBLE,
    PRIMARY KEY ((sensor_id, date, hour), reading_time)
) WITH CLUSTERING ORDER BY (reading_time ASC);

四、主键设计 #

4.1 主键类型 #

text
主键类型:

1. 单列主键
   PRIMARY KEY (column)
   
2. 复合主键(分区键+聚簇列)
   PRIMARY KEY (partition_key, clustering_column)
   
3. 复合分区键+聚簇列
   PRIMARY KEY ((pk1, pk2), ck1, ck2)

4.2 主键示例 #

sql
-- 单列主键
CREATE TABLE simple_pk (
    id UUID PRIMARY KEY,
    data TEXT
);

-- 分区键+聚簇列
CREATE TABLE compound_pk (
    user_id UUID,
    event_time TIMESTAMP,
    event_data TEXT,
    PRIMARY KEY (user_id, event_time)
) WITH CLUSTERING ORDER BY (event_time DESC);

-- 复合分区键+多聚簇列
CREATE TABLE complex_pk (
    tenant_id UUID,
    user_id UUID,
    event_date DATE,
    event_time TIMESTAMP,
    event_data TEXT,
    PRIMARY KEY ((tenant_id, user_id), event_date, event_time)
) WITH CLUSTERING ORDER BY (event_date DESC, event_time DESC);

4.3 主键选择原则 #

text
分区键选择:
├── 高基数(唯一值多)
├── 数据均匀分布
├── 查询模式匹配
└── 避免热点

聚簇列选择:
├── 排序需求
├── 范围查询需求
└── 数据访问模式

五、表属性配置 #

5.1 常用表属性 #

sql
CREATE TABLE users (
    user_id UUID PRIMARY KEY,
    name TEXT,
    email TEXT
) WITH 
    comment = '用户信息表' AND
    gc_grace_seconds = 864000 AND
    read_repair_chance = 0.1 AND
    dclocal_read_repair_chance = 0.1 AND
    compaction = {'class': 'SizeTieredCompactionStrategy'} AND
    compression = {'sstable_compression': 'LZ4Compressor'};

5.2 属性说明 #

属性 描述 默认值
comment 表注释 -
gc_grace_seconds 墓碑回收时间 864000(10天)
read_repair_chance 读修复概率 0.1
compaction 压缩策略 SizeTiered
compression 压缩算法 LZ4
caching 缓存配置
default_time_to_live 默认TTL 0

5.3 压缩策略 #

sql
-- SizeTieredCompactionStrategy (默认)
CREATE TABLE stcs_table (
    id UUID PRIMARY KEY,
    data TEXT
) WITH compaction = {
    'class': 'SizeTieredCompactionStrategy',
    'min_threshold': 4,
    'max_threshold': 32
};

-- LeveledCompactionStrategy
CREATE TABLE lcs_table (
    id UUID PRIMARY KEY,
    data TEXT
) WITH compaction = {
    'class': 'LeveledCompactionStrategy',
    'sstable_size_in_mb': 160
};

-- DateTieredCompactionStrategy (时间序列)
CREATE TABLE dtcs_table (
    id UUID PRIMARY KEY,
    event_time TIMESTAMP,
    data TEXT,
    PRIMARY KEY (id, event_time)
) WITH compaction = {
    'class': 'DateTieredCompactionStrategy',
    'base_time_seconds': 3600,
    'max_sstable_age_days': 365
};

-- TimeWindowCompactionStrategy (推荐时间序列)
CREATE TABLE twcs_table (
    id UUID PRIMARY KEY,
    event_time TIMESTAMP,
    data TEXT,
    PRIMARY KEY (id, event_time)
) WITH compaction = {
    'class': 'TimeWindowCompactionStrategy',
    'compaction_window_unit': 'HOURS',
    'compaction_window_size': 1
};

5.4 压缩配置 #

sql
-- LZ4压缩(推荐)
CREATE TABLE lz4_table (
    id UUID PRIMARY KEY,
    data TEXT
) WITH compression = {
    'sstable_compression': 'LZ4Compressor'
};

-- Snappy压缩
CREATE TABLE snappy_table (
    id UUID PRIMARY KEY,
    data TEXT
) WITH compression = {
    'sstable_compression': 'SnappyCompressor'
};

-- 无压缩
CREATE TABLE no_compression_table (
    id UUID PRIMARY KEY,
    data TEXT
) WITH compression = {
    'sstable_compression': ''
};

5.5 缓存配置 #

sql
-- 启用键缓存和行缓存
CREATE TABLE cached_table (
    id UUID PRIMARY KEY,
    data TEXT
) WITH caching = {
    'keys': 'ALL',
    'rows_per_partition': '100'
};

-- 仅键缓存
CREATE TABLE key_cached_table (
    id UUID PRIMARY KEY,
    data TEXT
) WITH caching = {
    'keys': 'ALL',
    'rows_per_partition': 'NONE'
};

六、排序规则 #

6.1 CLUSTERING ORDER #

sql
-- 默认升序
CREATE TABLE asc_table (
    user_id UUID,
    event_time TIMESTAMP,
    data TEXT,
    PRIMARY KEY (user_id, event_time)
);  -- event_time升序

-- 指定降序
CREATE TABLE desc_table (
    user_id UUID,
    event_time TIMESTAMP,
    data TEXT,
    PRIMARY KEY (user_id, event_time)
) WITH CLUSTERING ORDER BY (event_time DESC);  -- event_time降序

-- 多列排序
CREATE TABLE multi_sort_table (
    user_id UUID,
    event_date DATE,
    event_time TIMESTAMP,
    data TEXT,
    PRIMARY KEY (user_id, event_date, event_time)
) WITH CLUSTERING ORDER BY (event_date DESC, event_time ASC);

6.2 排序影响 #

text
排序规则影响:

查询
├── ORDER BY仅支持聚簇列
├── 排序方向必须与定义一致
└── 影响数据读取顺序

存储
├── 分区内数据按聚簇列排序
├── 影响压缩效率
└── 影响范围查询性能

七、完整示例 #

7.1 用户表 #

sql
CREATE TABLE users (
    user_id UUID,
    name TEXT,
    email TEXT,
    phone TEXT,
    age INT,
    address FROZEN<address_type>,
    tags SET<TEXT>,
    preferences MAP<TEXT, TEXT>,
    created_at TIMESTAMP,
    updated_at TIMESTAMP,
    PRIMARY KEY (user_id)
) WITH 
    comment = '用户信息表' AND
    gc_grace_seconds = 864000 AND
    compaction = {'class': 'SizeTieredCompactionStrategy'} AND
    compression = {'sstable_compression': 'LZ4Compressor'} AND
    caching = {'keys': 'ALL', 'rows_per_partition': 'NONE'};

7.2 订单表 #

sql
CREATE TABLE orders (
    user_id UUID,
    order_id UUID,
    order_date DATE,
    order_time TIMESTAMP,
    amount DECIMAL,
    status TEXT,
    items LIST<FROZEN<order_item>>,
    shipping_address FROZEN<address_type>,
    created_at TIMESTAMP,
    PRIMARY KEY (user_id, order_id)
) WITH CLUSTERING ORDER BY (order_id DESC)
AND 
    comment = '订单表' AND
    gc_grace_seconds = 864000 AND
    compaction = {'class': 'SizeTieredCompactionStrategy'} AND
    compression = {'sstable_compression': 'LZ4Compressor'};

7.3 时间序列表 #

sql
CREATE TABLE sensor_readings (
    sensor_id TEXT,
    date DATE,
    hour INT,
    reading_time TIMESTAMP,
    temperature DOUBLE,
    humidity DOUBLE,
    pressure DOUBLE,
    PRIMARY KEY ((sensor_id, date, hour), reading_time)
) WITH CLUSTERING ORDER BY (reading_time ASC)
AND 
    comment = '传感器读数表' AND
    default_time_to_live = 2592000 AND
    gc_grace_seconds = 86400 AND
    compaction = {
        'class': 'TimeWindowCompactionStrategy',
        'compaction_window_unit': 'HOURS',
        'compaction_window_size': 1
    } AND
    compression = {'sstable_compression': 'LZ4Compressor'};

八、验证和管理 #

8.1 查看表 #

sql
-- 查看所有表
DESCRIBE TABLES;

-- 查看特定表
DESCRIBE TABLE users;

-- 查看表详细信息
SELECT * FROM system_schema.tables
WHERE keyspace_name = 'my_app' AND table_name = 'users';

8.2 查看列信息 #

sql
-- 查看表列
DESCRIBE TABLE users;

-- 查看列详细信息
SELECT * FROM system_schema.columns
WHERE keyspace_name = 'my_app' AND table_name = 'users';

九、最佳实践 #

9.1 设计原则 #

text
表设计原则:

1. 基于查询设计
   └── 根据查询模式设计主键

2. 反范式化
   └── 数据冗余换取查询性能

3. 分区大小控制
   └── 单分区<100MB

4. 避免热点
   └── 分区键高基数、均匀分布

9.2 命名规范 #

sql
-- 推荐命名
CREATE TABLE user_profiles ...
CREATE TABLE order_items ...
CREATE TABLE product_categories ...

-- 不推荐命名
CREATE TABLE UserProfile ...    -- 大小写混合
CREATE TABLE user-profiles ...  -- 连字符

十、总结 #

创建表要点:

  1. 主键设计:基于查询模式设计
  2. 分区键:高基数、均匀分布
  3. 聚簇列:排序和范围查询需求
  4. 表属性:根据场景配置压缩和缓存
  5. 排序规则:CLUSTERING ORDER影响查询
  6. 命名规范:小写、下划线分隔

下一步,让我们学习修改表!

最后更新:2026-03-27