面试题答案
一键面试设计思路
- 分区键:
- 选择具有低基数(即不同值数量相对较少)且与查询模式相关的字段作为分区键。例如,如果经常按日期范围查询数据,可选择日期的某一部分(如年份或月份)作为分区键。这是因为Cassandra按分区键将数据分布在不同节点上,低基数的分区键能确保数据在节点间相对均匀分布,避免数据倾斜。同时,与查询模式相关的分区键能使查询操作更高效,因为Cassandra可以快速定位到存储相关数据的分区。
- 集群键:
- 选择与时间相关且具有高基数(不同值数量多)的字段作为集群键,如完整的时间戳字段。集群键用于在分区内对数据进行排序。时间戳作为集群键能确保数据按时间顺序排序,符合高效排序的需求。而且由于其高基数,能进一步细化数据的存储顺序,使同一分区内的数据按时间顺序紧凑存储,提升查询性能。
示例
假设数据库表存储传感器数据,包含传感器标识(sensor_id)、时间戳(timestamp)和传感器读数(reading)。
- 创建表的CQL语句:
CREATE TABLE sensor_data (
sensor_year int,
sensor_id text,
timestamp timestamp,
reading double,
PRIMARY KEY ((sensor_year), timestamp, sensor_id)
);
- 在上述语句中,
sensor_year
作为分区键,将数据按年份分区存储在不同节点上,确保数据分布均匀。timestamp
和sensor_id
作为集群键,timestamp
在前确保数据按时间顺序排序,sensor_id
进一步细化排序,这样在查询时,例如按年份和时间范围查询特定传感器的数据就会非常高效。
- 插入数据示例:
INSERT INTO sensor_data (sensor_year, sensor_id, timestamp, reading)
VALUES (2023, 'sensor1', '2023 - 01 - 01 12:00:00+0000', 25.5);
- 查询示例:
SELECT * FROM sensor_data WHERE sensor_year = 2023 AND timestamp >= '2023 - 01 - 01 00:00:00+0000' AND timestamp < '2023 - 02 - 01 00:00:00+0000';
- 该查询利用了分区键
sensor_year
快速定位到2023年的分区,再通过集群键timestamp
筛选出指定时间范围内的数据,实现高效查询。