1. 首页 > Cassandra教程 > 正文

Cassandra教程FG006-Cassandra CQL基础操作实战

本文档风哥主要介绍Cassandra数据库CQL基础操作实战,包括CQL概述、CQL语法基础、CQL数据类型、Keyspace操作、Table操作、CQL最佳实践、cqlsh工具使用、DDL操作实战、DML操作实战、用户管理实战、数据管理实战、CQL常见问题处理等内容,风哥教程参考Cassandra官方文档CQL内容编写,适合DBA人员和开发人员在学习和测试中使用,如果要应用于生产环境则需要自行确认。

Part01-基础概念与理论知识

1.1 Cassandra数据库CQL概述

CQL(Cassandra Query Language)是Cassandra数据库的查询语言,语法类似于SQL,但针对Cassandra的分布式特性进行了优化。CQL提供了简洁易用的接口,方便开发人员进行数据操作。更多视频教程www.fgedu.net.cn

1.1.1 Cassandra数据库CQL特点

# CQL特点说明

# 1. 类SQL语法
– 语法类似于标准SQL
– 学习成本低
– 易于上手

# 2. 针对分布式优化
– 支持分区键查询
– 支持一致性级别设置
– 支持TTL自动过期

# 3. 丰富的数据类型
– 支持基本数据类型
– 支持集合类型
– 支持用户定义类型

# 4. 安全特性
– 支持用户认证
– 支持权限管理
– 支持加密连接

# CQL与SQL对比
相同点:
– SELECT/INSERT/UPDATE/DELETE语法
– WHERE条件查询
– ORDER BY排序
– LIMIT分页

不同点:
– 不支持JOIN
– 不支持复杂事务
– 查询必须包含分区键
– 支持TTL

1.1.2 Cassandra数据库CQL版本

# CQL版本说明

# CQL版本对应关系
Cassandra 3.x → CQL 3.4.x
Cassandra 4.0 → CQL 3.4.5
Cassandra 4.1 → CQL 3.4.5

# 查看CQL版本
cqlsh> SELECT cql_version FROM system.local;

cql_version
————-
3.4.5

(1 rows)

# CQL主要功能
– DDL: CREATE/ALTER/DROP/TRUNCATE
– DML: SELECT/INSERT/UPDATE/DELETE/BATCH
– 安全: CREATE/ALTER/DROP ROLE, GRANT/REVOKE
– 函数: 内置函数和用户定义函数
– 聚合: 内置聚合和用户定义聚合

1.2 Cassandra数据库CQL语法基础

Cassandra数据库CQL语法基础说明:

1.2.1 Cassandra数据库CQL基本语法

# CQL基本语法

# 1. 大小写规则
– 关键字不区分大小写
– 标识符默认不区分大小写
– 使用双引号区分大小写

# 示例
SELECT * FROM fgedu_users; — 正确
select * from fgedu_users; — 正确
SELECT * FROM “FgeduUsers”; — 区分大小写

# 2. 注释
— 单行注释
/* 多行注释 */

# 3. 字符串
– 单引号: ‘string’
– 支持转义: ‘it\’s a test’

# 4. 数字
– 整数: 123
– 浮点数: 123.45
– 科学计数法: 1.23e5

# 5. 布尔值
– true
– false

# 6. NULL值
– NULL表示空值
– 不支持空字符串

# 7. 标识符
– 字母或下划线开头
– 可包含字母、数字、下划线
– 长度不超过48个字符

1.2.2 Cassandra数据库CQL关键字

# CQL保留关键字

# DDL关键字
CREATE, ALTER, DROP, TRUNCATE
KEYSPACE, TABLE, INDEX, TYPE, FUNCTION, AGGREGATE, TRIGGER

# DML关键字
SELECT, INSERT, UPDATE, DELETE, BATCH
FROM, WHERE, ORDER BY, LIMIT, USING, IF

# 数据类型关键字
TEXT, INT, BIGINT, FLOAT, DOUBLE, BOOLEAN
TIMESTAMP, DATE, TIME, UUID, BLOB
LIST, SET, MAP, TUPLE, FROZEN

# 安全关键字
ROLE, USER, PASSWORD, LOGIN, SUPERUSER
GRANT, REVOKE, PERMISSION, ALL

# 其他关键字
PRIMARY KEY, PARTITION KEY, CLUSTERING ORDER
REPLICATION, DURABLE_WRITES, TTL, WRITETIME
CONSISTENCY, ALLOW FILTERING

1.3 Cassandra数据库CQL数据类型

Cassandra数据库CQL数据类型详解:

1.3.1 Cassandra数据库基本数据类型

# 基本数据类型

# 数值类型
TINYINT – 8位有符号整数 (-128 to 127)
SMALLINT – 16位有符号整数 (-32768 to 32767)
INT – 32位有符号整数 (-2147483648 to 2147483647)
BIGINT – 64位有符号整数
VARINT – 任意精度整数
FLOAT – 32位IEEE-754浮点数
DOUBLE – 64位IEEE-754浮点数
DECIMAL – 高精度十进制数

# 文本类型
TEXT – UTF-8编码字符串
VARCHAR – UTF-8编码字符串(与TEXT相同)
ASCII – ASCII字符串

# 时间类型
TIMESTAMP – 时间戳(毫秒精度)
DATE – 日期(年月日)
TIME – 时间(时分秒纳秒)
DURATION – 时间间隔

# 布尔类型
BOOLEAN – 布尔值(true/false)

# 二进制类型
BLOB – 二进制数据

# 标识类型
UUID – 标准UUID
TIMEUUID – 时间有序UUID

# IP地址类型
INET – IPv4或IPv6地址

# 计数器类型
COUNTER – 计数器(只能增减)

1.3.2 Cassandra数据库集合数据类型

# 集合数据类型

# LIST(列表)
– 有序元素集合
– 允许重复元素
– 支持索引访问
示例: LIST

# SET(集合)
– 无序元素集合
– 不允许重复元素
– 自动去重
示例: SET

# MAP(映射)
– 键值对集合
– 键不允许重复
– 支持按键查询
示例: MAP

# 使用示例
CREATE TABLE fgedu_collections (
id uuid PRIMARY KEY,
tags LIST,
categories SET,
attributes MAP
);

# 插入数据
INSERT INTO fgedu_collections (id, tags, categories, attributes)
VALUES (
uuid(),
[‘tag1’, ‘tag2’, ‘tag3’],
{‘category1’, ‘category2’},
{‘key1’: ‘value1’, ‘key2’: ‘value2’}
);

# 更新集合
UPDATE fgedu_collections SET tags = tags + [‘tag4’] WHERE id = ?;
UPDATE fgedu_collections SET categories = categories + {‘category3’} WHERE id = ?;
UPDATE fgedu_collections SET attributes = attributes + {‘key3’: ‘value3’} WHERE id = ?;

# 删除集合元素
UPDATE fgedu_collections SET tags = tags – [‘tag1’] WHERE id = ?;
UPDATE fgedu_collections SET categories = categories – {‘category1’} WHERE id = ?;
DELETE attributes[‘key1’] FROM fgedu_collections WHERE id = ?;

1.3.3 Cassandra数据库用户定义类型

# 用户定义类型(UDT)

# 创建UDT
CREATE TYPE fgedu_address (
province TEXT,
city TEXT,
street TEXT,
zip_code TEXT
);

CREATE TYPE fgedu_phone (
type TEXT,
number TEXT
);

# 使用UDT
CREATE TABLE fgedu_contacts (
user_id UUID PRIMARY KEY,
name TEXT,
address FROZEN,
phones LIST>
);

# 插入UDT数据
INSERT INTO fgedu_contacts (user_id, name, address, phones)
VALUES (
uuid(),
‘张三’,
{province: ‘北京’, city: ‘北京市’, street: ‘朝阳区xxx’, zip_code: ‘100000’},
[{type: ‘手机’, number: ‘13800138000’}, {type: ‘座机’, number: ‘010-12345678’}]
);

# 查询UDT数据
SELECT * FROM fgedu_contacts WHERE user_id = ?;

# 更新UDT字段
UPDATE fgedu_contacts
SET address = {province: ‘上海’, city: ‘上海市’, street: ‘浦东新区xxx’, zip_code: ‘200000’}
WHERE user_id = ?;

# 注意事项
– UDT必须使用FROZEN关键字
– FROZEN表示整个UDT作为一个原子值
– 更新UDT需要更新整个值

Part02-生产环境规划与建议

2.1 Cassandra数据库Keyspace操作

Cassandra数据库Keyspace操作详解:

2.1.1 Cassandra数据库创建Keyspace

# 创建Keyspace语法
CREATE KEYSPACE [IF NOT EXISTS] keyspace_name
WITH replication = {‘class’: ‘strategy_class’, …}
[AND durable_writes = true|false];

# 创建Keyspace示例
# 方式1: SimpleStrategy
cqlsh> CREATE KEYSPACE fgedudb
… WITH replication = {
… ‘class’: ‘SimpleStrategy’,
… ‘replication_factor’: 3
… }
… AND durable_writes = true;

# 方式2: NetworkTopologyStrategy
cqlsh> CREATE KEYSPACE fgedu_order_db
… WITH replication = {
… ‘class’: ‘NetworkTopologyStrategy’,
… ‘dc1’: 3,
… ‘dc2’: 2
… }
… AND durable_writes = true;

# 方式3: 避免重复创建
cqlsh> CREATE KEYSPACE IF NOT EXISTS fgedudb
… WITH replication = {
… ‘class’: ‘SimpleStrategy’,
… ‘replication_factor’: 3
… };

# 查看Keyspace
cqlsh> DESCRIBE KEYSPACES;

fgedudb fgedu_order_db system system_auth system_distributed system_schema system_traces

# 查看Keyspace详情
cqlsh> DESCRIBE KEYSPACE fgedudb;

CREATE KEYSPACE fgedudb WITH replication = {‘class’: ‘SimpleStrategy’, ‘replication_factor’: ‘3’} AND durable_writes = true;

2.1.2 Cassandra数据库修改Keyspace

# 修改Keyspace语法
ALTER KEYSPACE keyspace_name
WITH replication = {‘class’: ‘strategy_class’, …}
[AND durable_writes = true|false];

# 修改Keyspace示例
# 修改副本策略
cqlsh> ALTER KEYSPACE fgedudb
… WITH replication = {
… ‘class’: ‘NetworkTopologyStrategy’,
… ‘dc1’: 3
… };

# 修改持久化配置
cqlsh> ALTER KEYSPACE fgedudb
… WITH durable_writes = false;

# 注意事项
# 修改副本策略后需要运行repair
# nodetool repair fgedudb

# 删除Keyspace
cqlsh> DROP KEYSPACE IF EXISTS fgedu_test_db;

2.2 Cassandra数据库Table操作

Cassandra数据库Table操作详解:

2.2.1 Cassandra数据库创建Table

# 创建Table语法
CREATE TABLE [IF NOT EXISTS] table_name (
column_name data_type [STATIC],

PRIMARY KEY (partition_key[, clustering_key…])
)
[WITH table_options];

# 创建Table示例
cqlsh> USE fgedudb;
cqlsh:fgedudb> CREATE TABLE fgedu_users (
… user_id uuid PRIMARY KEY,
… user_name text,
… email text,
… age int,
… created_at timestamp
… );

# 创建复合主键Table
cqlsh:fgedudb> CREATE TABLE fgedu_orders (
… user_id uuid,
… order_time timestamp,
… order_id uuid,
… amount decimal,
… status text,
… PRIMARY KEY (user_id, order_time)
… ) WITH CLUSTERING ORDER BY (order_time DESC);

# 创建带选项的Table
cqlsh:fgedudb> CREATE TABLE fgedu_logs (
… log_id uuid PRIMARY KEY,
… log_time timestamp,
… log_level text,
… message text
… ) WITH
… comment = ‘日志表’ AND
… compaction = {‘class’: ‘SizeTieredCompactionStrategy’} AND
… compression = {‘class’: ‘LZ4Compressor’} AND
… default_time_to_live = 604800 AND
… gc_grace_seconds = 86400;

# 查看Table
cqlsh:fgedudb> DESCRIBE TABLES;

fgedu_users fgedu_orders fgedu_logs

# 查看Table详情
cqlsh:fgedudb> DESCRIBE TABLE fgedu_users;

2.2.2 Cassandra数据库修改Table

# 添加列
cqlsh:fgedudb> ALTER TABLE fgedu_users ADD phone text;

cqlsh:fgedudb> ALTER TABLE fgedu_users ADD address frozen;

# 删除列
cqlsh:fgedudb> ALTER TABLE fgedu_users DROP phone;

# 修改Table选项
cqlsh:fgedudb> ALTER TABLE fgedu_users
… WITH comment = ‘用户信息表’
… AND compression = {‘class’: ‘LZ4Compressor’, ‘chunk_length_in_kb’: 64};

# 修改压缩策略
cqlsh:fgedudb> ALTER TABLE fgedu_orders
… WITH compaction = {‘class’: ‘LeveledCompactionStrategy’};

# 清空Table数据
cqlsh:fgedudb> TRUNCATE TABLE fgedu_test;

# 删除Table
cqlsh:fgedudb> DROP TABLE IF EXISTS fgedu_test;

2.3 Cassandra数据库CQL最佳实践

Cassandra数据库CQL最佳实践建议:

2.3.1 Cassandra数据库CQL编写规范

# CQL编写规范

# 1. 命名规范
– 使用小写字母
– 使用下划线分隔单词
– 名称要有意义

# 好的命名
fgedu_users
fgedu_order_items
fgedu_user_activities

# 不好的命名
Users
userTable
tbl_user

# 2. 格式规范
– 关键字大写
– 适当换行
– 使用缩进

# 示例
SELECT user_id, user_name, email
FROM fgedu_users
WHERE user_id = ?
LIMIT 10;

# 3. 查询规范
– 查询必须包含分区键
– 避免使用ALLOW FILTERING
– 合理使用LIMIT

# 4. 写入规范
– 使用BATCH保证原子性
– 合理设置TTL
– 使用PREPARED语句

# 5. 安全规范
– 使用参数化查询
– 避免SQL注入
– 控制用户权限

风哥提示:CQL编写规范是保证代码质量和系统性能的基础。遵循命名规范、格式规范、查询规范、写入规范和安全规范,可以提高开发效率和系统稳定性。学习交流加群风哥微信: itpux-com

Part03-生产环境项目实施方案

3.1 Cassandra数据库cqlsh工具使用

Cassandra数据库cqlsh工具使用详解:

3.1.1 Cassandra数据库cqlsh连接

# cqlsh连接语法
cqlsh [host] [port] [options]

# 常用选项
-u, –username 用户名
-p, –password 密码
-k, –keyspace 默认Keyspace
-f, –file 执行文件
-e, –execute 执行语句
–ssl 使用SSL连接
–cqlversion CQL版本

# 连接示例
# 默认连接
# cqlsh
Connected to Test Cluster at 127.0.0.1:9042
[cqlsh 6.8.0 | Cassandra 4.1.0 | CQL spec 3.4.5 | Native protocol v5]
Use HELP for help.

# 指定主机和端口
# cqlsh 192.168.1.101 9042

# 使用用户名密码连接
# cqlsh 192.168.1.101 9042 -u fgedu -p Fgedu@2024

# 指定默认Keyspace
# cqlsh 192.168.1.101 9042 -k fgedudb

# 使用SSL连接
# cqlsh 192.168.1.101 9042 –ssl

# 执行单条语句
# cqlsh -e “SELECT * FROM fgedudb.fgedu_users LIMIT 10”

# 执行脚本文件
# cqlsh -f /path/to/script.cql

3.1.2 Cassandra数据库cqlsh常用命令

# cqlsh常用命令

# 帮助命令
cqlsh> HELP

# 查看Keyspace
cqlsh> DESCRIBE KEYSPACES;

# 查看Table
cqlsh> DESCRIBE TABLES;

# 查看Keyspace详情
cqlsh> DESCRIBE KEYSPACE fgedudb;

# 查看Table详情
cqlsh> DESCRIBE TABLE fgedu_users;

# 查看完整Schema
cqlsh> DESCRIBE SCHEMA;

# 切换Keyspace
cqlsh> USE fgedudb;
cqlsh:fgedudb>

# 查看一致性级别
cqlsh> CONSISTENCY
Current consistency level is ONE.

# 设置一致性级别
cqlsh> CONSISTENCY QUORUM
Consistency level set to QUORUM.

# 查看序列化格式
cqlsh> SERIAL CONSISTENCY
Current serial consistency level is SERIAL.

# 设置序列化格式
cqlsh> SERIAL CONSISTENCY LOCAL_SERIAL

# 查看时间戳格式
cqlsh> TIMESTAMPS
Current timestamp format: DEFAULT_FORMAT

# 设置时间戳格式
cqlsh> TIMESTAMPS ISO8601

# 退出cqlsh
cqlsh> EXIT
cqlsh> QUIT

3.2 Cassandra数据库DDL操作实战

Cassandra数据库DDL操作实战:

3.2.1 Cassandra数据库创建对象

# 连接Cassandra
# cqlsh 192.168.1.101 9042 -u fgedu -p Fgedu@2024
Connected to fgedu_cluster at 192.168.1.101:9042
[cqlsh 6.8.0 | Cassandra 4.1.0 | CQL spec 3.4.5 | Native protocol v5]

# 创建Keyspace
cqlsh> CREATE KEYSPACE fgedudb
… WITH replication = {
… ‘class’: ‘NetworkTopologyStrategy’,
… ‘dc1’: 3
… }
… AND durable_writes = true;

# 切换到Keyspace
cqlsh> USE fgedudb;
cqlsh:fgedudb>

# 创建UDT
cqlsh:fgedudb> CREATE TYPE fgedu_address (
… province text,
… city text,
… street text,
… zip_code text
… );

# 创建Table
cqlsh:fgedudb> CREATE TABLE fgedu_users (
… user_id uuid PRIMARY KEY,
… user_name text,
… email text,
… phone text,
… address frozen,
… age int,
… tags set,
… created_at timestamp,
… updated_at timestamp
… );

# 创建Index
cqlsh:fgedudb> CREATE INDEX idx_email ON fgedu_users (email);

# 创建自定义Index
cqlsh:fgedudb> CREATE CUSTOM INDEX idx_email_sai ON fgedu_users (email)
… USING ‘StorageAttachedIndex’;

# 验证创建结果
cqlsh:fgedudb> DESCRIBE TABLE fgedu_users;

CREATE TABLE fgedudb.fgedu_users (
user_id uuid PRIMARY KEY,
address frozen,
age int,
created_at timestamp,
email text,
phone text,
tags set,
updated_at timestamp,
user_name text
) WITH …
CREATE INDEX idx_email ON fgedudb.fgedu_users (email);

3.2.2 Cassandra数据库修改对象

# 添加列
cqlsh:fgedudb> ALTER TABLE fgedu_users ADD status text;

# 添加多个列
cqlsh:fgedudb> ALTER TABLE fgedu_users
… ADD login_count counter
… ADD last_login timestamp;

# 注意: counter列需要单独的表
# 创建counter表
cqlsh:fgedudb> CREATE TABLE fgedu_user_counters (
… user_id uuid PRIMARY KEY,
… login_count counter,
… post_count counter
… );

# 修改Table属性
cqlsh:fgedudb> ALTER TABLE fgedu_users
… WITH comment = ‘用户信息表’
… AND gc_grace_seconds = 864000
… AND default_time_to_live = 0;

# 修改压缩配置
cqlsh:fgedudb> ALTER TABLE fgedu_users
… WITH compression = {
… ‘class’: ‘LZ4Compressor’,
… ‘chunk_length_in_kb’: 64
… };

# 修改压缩策略
cqlsh:fgedudb> ALTER TABLE fgedu_users
… WITH compaction = {
… ‘class’: ‘SizeTieredCompactionStrategy’,
… ‘min_threshold’: 4,
… ‘max_threshold’: 32
… };

# 删除列
cqlsh:fgedudb> ALTER TABLE fgedu_users DROP status;

# 删除Index
cqlsh:fgedudb> DROP INDEX IF EXISTS idx_email;

# 删除Table
cqlsh:fgedudb> DROP TABLE IF EXISTS fgedu_test;

# 删除Keyspace
cqlsh> DROP KEYSPACE IF EXISTS fgedu_test_db;

3.3 Cassandra数据库DML操作实战

Cassandra数据库DML操作实战:

3.3.1 Cassandra数据库INSERT操作

# INSERT语法
INSERT INTO table_name (column_names)
VALUES (values)
[USING TTL seconds]
[USING TIMESTAMP timestamp]
[IF NOT EXISTS];

# 基本INSERT
cqlsh:fgedudb> INSERT INTO fgedu_users
… (user_id, user_name, email, phone, age, created_at, updated_at)
… VALUES (
… uuid(),
… ‘zhangsan’,
… ‘zhangsan@fgedu.net.cn’,
… ‘13800138000’,
… 25,
… toTimestamp(now()),
… toTimestamp(now())
… );

# 使用TTL
cqlsh:fgedudb> INSERT INTO fgedu_users
… (user_id, user_name, email)
… VALUES (uuid(), ‘lisi’, ‘lisi@fgedu.net.cn’)
… USING TTL 86400; — 1天后过期

# 使用JSON
cqlsh:fgedudb> INSERT INTO fgedu_users JSON ‘{
… “user_id”: “uuid()”,
… “user_name”: “wangwu”,
… “email”: “wangwu@fgedu.net.cn”,
… “age”: 30
… }’;

# 条件INSERT(不存在时插入)
cqlsh:fgedudb> INSERT INTO fgedu_users
… (user_id, user_name, email)
… VALUES (uuid(), ‘zhaoliu’, ‘zhaoliu@fgedu.net.cn’)
… IF NOT EXISTS;

# 插入集合类型
cqlsh:fgedudb> INSERT INTO fgedu_users
… (user_id, user_name, tags)
… VALUES (uuid(), ‘qianqi’, {‘tag1’, ‘tag2’, ‘tag3’});

# 插入UDT
cqlsh:fgedudb> INSERT INTO fgedu_users
… (user_id, user_name, address)
… VALUES (
… uuid(),
… ‘sunba’,
… {province: ‘北京’, city: ‘北京市’, street: ‘朝阳区xxx’, zip_code: ‘100000’}
… );

3.3.2 Cassandra数据库SELECT操作

# SELECT语法
SELECT [column_names]
FROM table_name
[WHERE where_clause]
[ORDER BY column_name]
[LIMIT n]
[ALLOW FILTERING];

# 基本SELECT
cqlsh:fgedudb> SELECT * FROM fgedu_users LIMIT 5;

user_id | address | age | created_at | email | phone | tags | updated_at | user_name
————————————–+———+—–+———————————-+———————-+————-+——+————+———–
8e5f6a7b-8c9d-0e1f-2a3b-4c5d6e7f8a9b | null | 25 | 2024-01-15 10:30:00.123000+0000 | zhangsan@fgedu.net.cn | 13800138000 | null | 2024-01-15 10:30:00.123000+0000 | zhangsan

(1 row)

# 选择特定列
cqlsh:fgedudb> SELECT user_id, user_name, email FROM fgedu_users LIMIT 5;

# WHERE条件查询(必须包含分区键)
cqlsh:fgedudb> SELECT * FROM fgedu_users
… WHERE user_id = 8e5f6a7b-8c9d-0e1f-2a3b-4c5d6e7f8a9b;

# 范围查询(需要聚簇键)
cqlsh:fgedudb> SELECT * FROM fgedu_orders
… WHERE user_id = ?
… AND order_time >= ‘2024-01-01’
… AND order_time < '2024-02-01'; # ORDER BY排序 cqlsh:fgedudb> SELECT * FROM fgedu_orders
… WHERE user_id = ?
… ORDER BY order_time DESC
… LIMIT 10;

# 使用函数
cqlsh:fgedudb> SELECT user_id, user_name,
… toTimestamp(now()) as current_time,
… writetime(user_name) as write_time
… FROM fgedu_users
… LIMIT 5;

# 使用聚合函数
cqlsh:fgedudb> SELECT COUNT(*) FROM fgedu_users;

count
——-
5

(1 row)

# 使用ALLOW FILTERING(不推荐)
cqlsh:fgedudb> SELECT * FROM fgedu_users WHERE age > 25 ALLOW FILTERING;

3.3.3 Cassandra数据库UPDATE操作

# UPDATE语法
UPDATE table_name
SET column_name = value [, …]
[USING TTL seconds]
[USING TIMESTAMP timestamp]
WHERE where_clause
[IF EXISTS | IF condition];

# 基本UPDATE
cqlsh:fgedudb> UPDATE fgedu_users
… SET user_name = ‘张三’,
… phone = ‘13900139000’,
… updated_at = toTimestamp(now())
… WHERE user_id = 8e5f6a7b-8c9d-0e1f-2a3b-4c5d6e7f8a9b;

# 使用TTL
cqlsh:fgedudb> UPDATE fgedu_users
… SET email = ‘newemail@fgedu.net.cn’
… USING TTL 3600
… WHERE user_id = 8e5f6a7b-8c9d-0e1f-2a3b-4c5d6e7f8a9b;

# 条件UPDATE
cqlsh:fgedudb> UPDATE fgedu_users
… SET user_name = ‘新名字’
… WHERE user_id = 8e5f6a7b-8c9d-0e1f-2a3b-4c5d6e7f8a9b
… IF EXISTS;

# 更新集合
# 添加元素
cqlsh:fgedudb> UPDATE fgedu_users
… SET tags = tags + {‘new_tag’}
… WHERE user_id = 8e5f6a7b-8c9d-0e1f-2a3b-4c5d6e7f8a9b;

# 删除元素
cqlsh:fgedudb> UPDATE fgedu_users
… SET tags = tags – {‘old_tag’}
… WHERE user_id = 8e5f6a7b-8c9d-0e1f-2a3b-4c5d6e7f8a9b;

# 更新Counter
cqlsh:fgedudb> UPDATE fgedu_user_counters
… SET login_count = login_count + 1
… WHERE user_id = 8e5f6a7b-8c9d-0e1f-2a3b-4c5d6e7f8a9b;

3.3.4 Cassandra数据库DELETE操作

# DELETE语法
DELETE [column_names]
FROM table_name
[USING TIMESTAMP timestamp]
WHERE where_clause
[IF EXISTS | IF condition];

# 删除整行
cqlsh:fgedudb> DELETE FROM fgedu_users
… WHERE user_id = 8e5f6a7b-8c9d-0e1f-2a3b-4c5d6e7f8a9b;

# 删除特定列
cqlsh:fgedudb> DELETE phone, address FROM fgedu_users
… WHERE user_id = 8e5f6a7b-8c9d-0e1f-2a3b-4c5d6e7f8a9b;

# 删除集合元素
cqlsh:fgedudb> DELETE tags[‘tag1’] FROM fgedu_users
… WHERE user_id = 8e5f6a7b-8c9d-0e1f-2a3b-4c5d6e7f8a9b;

# 条件删除
cqlsh:fgedudb> DELETE FROM fgedu_users
… WHERE user_id = 8e5f6a7b-8c9d-0e1f-2a3b-4c5d6e7f8a9b
… IF EXISTS;

# 删除范围数据(需要聚簇键)
cqlsh:fgedudb> DELETE FROM fgedu_orders
… WHERE user_id = ?
… AND order_time >= ‘2024-01-01’
… AND order_time < '2024-02-01'; # 批量删除 cqlsh:fgedudb> BEGIN BATCH
… DELETE FROM fgedu_users WHERE user_id = ?;
… DELETE FROM fgedu_users_by_email WHERE email = ?;
… APPLY BATCH;

操作建议:DML操作时注意分区键必须指定,避免使用ALLOW FILTERING。使用BATCH保证原子性,合理设置TTL。更多学习教程公众号风哥教程itpux_com

Part04-生产案例与实战讲解

4.1 Cassandra数据库用户管理实战

Cassandra数据库用户管理实战:

4.1.1 Cassandra数据库创建用户

# 连接Cassandra(使用超级用户)
# cqlsh 192.168.1.101 9042 -u cassandra -p cassandra

# 创建角色
cqlsh> CREATE ROLE fgedu_admin
… WITH PASSWORD = ‘FgeduAdmin@2024’
… AND LOGIN = true
… AND SUPERUSER = true;

# 创建应用用户
cqlsh> CREATE ROLE fgedu
… WITH PASSWORD = ‘Fgedu@2024’
… AND LOGIN = true
… AND SUPERUSER = false;

# 创建只读用户
cqlsh> CREATE ROLE fgedu_readonly
… WITH PASSWORD = ‘FgeduRead@2024’
… AND LOGIN = true
… AND SUPERUSER = false;

# 查看用户列表
cqlsh> LIST ROLES;

role | super | login | options
—————–+——-+——-+———
cassandra | True | True | {}
fgedu_admin | True | True | {}
fgedu | False | True | {}
fgedu_readonly | False | True | {}

(4 rows)

# 修改用户密码
cqlsh> ALTER ROLE fgedu WITH PASSWORD = ‘NewFgedu@2024’;

# 删除用户
cqlsh> DROP ROLE IF EXISTS fgedu_test;

4.1.2 Cassandra数据库权限管理

# 授权语法
GRANT permission ON resource TO role;

# 权限类型
ALL PERMISSIONS – 所有权限
CREATE – 创建权限
ALTER – 修改权限
DROP – 删除权限
SELECT – 查询权限
MODIFY – 修改数据权限
AUTHORIZE – 授权权限

# 授权示例
# 授予Keyspace所有权限
cqlsh> GRANT ALL PERMISSIONS ON KEYSPACE fgedudb TO fgedu;

# 授予表查询权限
cqlsh> GRANT SELECT ON TABLE fgedudb.fgedu_users TO fgedu_readonly;

# 授予表修改权限
cqlsh> GRANT MODIFY ON TABLE fgedudb.fgedu_users TO fgedu;

# 授予创建权限
cqlsh> GRANT CREATE ON KEYSPACE fgedudb TO fgedu_admin;

# 查看权限
cqlsh> LIST ALL PERMISSIONS OF fgedu;

role | username | resource | permission
——-+———-+—————–+————
fgedu | fgedu | | ALTER
fgedu | fgedu | | CREATE
fgedu | fgedu | | DROP
fgedu | fgedu | | MODIFY
fgedu | fgedu | | SELECT

(5 rows)

# 撤销权限
cqlsh> REVOKE SELECT ON TABLE fgedudb.fgedu_users FROM fgedu_readonly;

# 撤销所有权限
cqlsh> REVOKE ALL PERMISSIONS ON KEYSPACE fgedudb FROM fgedu;

4.2 Cassandra数据库数据管理实战

Cassandra数据库数据管理实战:

4.2.1 Cassandra数据库数据导入导出

# 使用COPY命令导出数据
cqlsh:fgedudb> COPY fgedu_users
… TO ‘/tmp/fgedu_users.csv’
… WITH HEADER = true;

# 导出特定列
cqlsh:fgedudb> COPY fgedu_users (user_id, user_name, email)
… TO ‘/tmp/fgedu_users_partial.csv’
… WITH HEADER = true;

# 导出查询结果
cqlsh:fgedudb> COPY (SELECT user_id, user_name, email
… FROM fgedu_users
… WHERE user_id = ?)
… TO ‘/tmp/fgedu_users_query.csv’
… WITH HEADER = true;

# 导入数据
cqlsh:fgedudb> COPY fgedu_users
… FROM ‘/tmp/fgedu_users.csv’
… WITH HEADER = true;

# 导入选项
cqlsh:fgedudb> COPY fgedu_users
… FROM ‘/tmp/fgedu_users.csv’
… WITH HEADER = true
… AND INGESTRATE = 10000
… AND MAXBATCHSIZE = 20
… AND MAXERRORS = 100
… AND SKIPROWS = 0;

# 使用DSBulk工具(推荐大数据量)
# 导出
# dsbulk unload -k fgedudb -t fgedu_users -url /tmp/export

# 导入
# dsbulk load -k fgedudb -t fgedu_users -url /tmp/import

# 计数
# dsbulk count -k fgedudb -t fgedu_users

4.2.2 Cassandra数据库数据清理

# 清理过期数据

# 方法1: 使用TTL自动过期
cqlsh:fgedudb> INSERT INTO fgedu_logs (log_id, log_time, message)
… VALUES (uuid(), toTimestamp(now()), ‘test log’)
… USING TTL 86400; — 1天后自动删除

# 方法2: 设置表默认TTL
cqlsh:fgedudb> ALTER TABLE fgedu_logs
… WITH default_time_to_live = 604800; — 7天

# 方法3: 手动删除
cqlsh:fgedudb> DELETE FROM fgedu_logs
… WHERE log_date = ‘2024-01-01’;

# 清理大分区数据
# 使用分批删除
#!/bin/bash
# delete_old_logs.sh
# from:www.itpux.com.qq113257174.wx:itpux-com
# web: http://www.fgedu.net.cn

for date in $(seq -f “2024-01-%02g” 1 15); do
cqlsh -e “DELETE FROM fgedudb.fgedu_logs WHERE log_date = ‘$date'”
echo “Deleted logs for $date”
done

# 使用TRUNCATE清空表
cqlsh:fgedudb> TRUNCATE TABLE fgedu_logs;

# 注意: TRUNCATE会清空整个表,谨慎使用

4.3 Cassandra数据库CQL常见问题处理

Cassandra数据库CQL常见问题处理:

4.3.1 Cassandra数据库查询超时问题

# 问题现象
cqlsh:fgedudb> SELECT * FROM fgedu_logs WHERE log_level = ‘ERROR’;
OperationTimedOut: errors={}, last_host=192.168.1.101

# 原因分析
# 1. 查询未指定分区键,导致全表扫描
# 2. 查询数据量过大
# 3. ALLOW FILTERING导致性能问题

# 解决方案
# 方案1: 指定分区键
cqlsh:fgedudb> SELECT * FROM fgedu_logs
… WHERE log_date = ‘2024-01-15’
… AND log_level = ‘ERROR’;

# 方案2: 创建索引
cqlsh:fgedudb> CREATE INDEX idx_log_level ON fgedu_logs (log_level);

# 方案3: 修改表结构
# 根据查询需求重新设计分区键

# 方案4: 增加超时时间
cqlsh:fgedudb> CONSISTENCY LOCAL_ONE
cqlsh:fgedudb> SELECT * FROM fgedu_logs WHERE log_level = ‘ERROR’ LIMIT 1000;

# 方案5: 分页查询
# 在应用代码中实现分页

4.3.2 Cassandra数据库写入失败问题

# 问题现象
cqlsh:fgedudb> INSERT INTO fgedu_users (user_id, user_name) VALUES (uuid(), ‘test’);
WriteTimeout: Error during write query at consistency LOCAL_QUORUM (1 response were required but 0 replica responded)

# 原因分析
# 1. 节点不可用
# 2. 网络问题
# 3. 写入超时
# 4. 一致性级别过高

# 解决方案
# 方案1: 检查节点状态
# nodetool status

# 方案2: 降低一致性级别
cqlsh:fgedudb> CONSISTENCY ONE
cqlsh:fgedudb> INSERT INTO fgedu_users (user_id, user_name) VALUES (uuid(), ‘test’);

# 方案3: 检查网络连接
# ping 192.168.1.101
# telnet 192.168.1.101 9042

# 方案4: 检查日志
# tail -100 /cassandra/logs/system.log

# 方案5: 增加写入超时
# 在cassandra.yaml中配置
# write_request_timeout_in_ms: 10000

风哥提示:CQL问题排查需要结合日志分析和系统状态检查。常见问题包括查询超时、写入失败、权限问题等。建议在测试环境充分验证后再应用到生产环境。from Cassandra视频:www.itpux.com

Part05-风哥经验总结与分享

5.1 Cassandra数据库CQL编写技巧

Cassandra数据库CQL编写技巧总结:

  • 分区键优先:查询必须包含分区键,避免全表扫描
  • 使用Prepared语句:提高性能,防止SQL注入
  • 合理使用BATCH:保证原子性,但不要过大
  • 设置TTL:自动清理过期数据
  • 使用一致性级别:根据业务需求选择合适的一致性级别
  • 避免ALLOW FILTERING:重新设计表结构而非使用过滤
  • 使用分页查询:避免一次性查询大量数据
  • 监控慢查询:及时发现和优化慢查询

5.2 Cassandra数据库CQL操作检查清单

# CQL操作检查清单

# 1. 查询操作
[ ] 查询包含分区键
[ ] 未使用ALLOW FILTERING
[ ] 使用LIMIT限制结果
[ ] 一致性级别合理

# 2. 写入操作
[ ] 使用BATCH保证原子性
[ ] 设置合理的TTL
[ ] 使用Prepared语句
[ ] 处理写入失败

# 3. 更新操作
[ ] WHERE条件正确
[ ] 更新必要字段
[ ] 处理并发更新

# 4. 删除操作
[ ] WHERE条件正确
[ ] 考虑数据恢复
[ ] 处理删除失败

# 5. 安全操作
[ ] 使用参数化查询
[ ] 权限控制合理
[ ] 敏感数据加密

# 6. 性能优化
[ ] 使用索引
[ ] 分页查询
[ ] 批量操作
[ ] 缓存热点数据

5.3 Cassandra数据库CQL工具推荐

Cassandra数据库CQL工具推荐:

5.3.1 Cassandra数据库CQL工具

# CQL工具推荐

# 1. cqlsh
# Cassandra自带命令行工具
# 支持交互式和脚本执行
# cqlsh 192.168.1.101 9042

# 2. DataStax DevCenter
# DataStax官方开发工具
# 图形化界面
# 支持CQL编辑和执行

# 3. DBeaver
# 通用数据库管理工具
# 支持Cassandra连接
# 支持数据可视化

# 4. DataStax Studio
# DataStax官方可视化工具
# 支持Notebook模式
# 支持数据可视化

# 5. IntelliJ IDEA
# 集成开发环境
# 支持Cassandra插件
# 支持CQL语法高亮

# 6. VS Code
# 轻量级编辑器
# 支持Cassandra扩展
# 支持CQL语法高亮

工具使用建议:选择适合自己的工具,提高开发效率。命令行工具适合运维管理,图形化工具适合开发调试。

本文档详细介绍了Cassandra数据库CQL基础操作实战,包括CQL概述、CQL语法基础、CQL数据类型、Keyspace操作、Table操作、CQL最佳实践、cqlsh工具使用、DDL操作实战、DML操作实战、用户管理实战、数据管理实战、CQL常见问题处理、CQL编写技巧、CQL操作检查清单、CQL工具推荐等内容。通过学习本文档,读者可以掌握Cassandra数据库CQL操作技能,为应用开发打下坚实基础。

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息