创建表 #
一、表概述 #
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 ... -- 连字符
十、总结 #
创建表要点:
- 主键设计:基于查询模式设计
- 分区键:高基数、均匀分布
- 聚簇列:排序和范围查询需求
- 表属性:根据场景配置压缩和缓存
- 排序规则:CLUSTERING ORDER影响查询
- 命名规范:小写、下划线分隔
下一步,让我们学习修改表!
最后更新:2026-03-27