cassandra - cassandra 中的 ORDER BY 成本
问题描述
我知道 cassandra 表中的数据已经按聚类列排序。因此,当我们使用该ORDER BY
子句时,假设实际上没有进行任何排序(跨行时)是否安全?使用时是否只是以相反的顺序获取结果ORDER BY
?我想知道这个手术的费用。
解决方案
好的,假设我有这张表,旨在通过他们购买的音乐专辑跟踪客户:
CREATE TABLE customers_by_album (
album TEXT,
band TEXT,
custno INT,
customer_name TEXT,
PRIMARY KEY (album,custno))
WITH CLUSTERING ORDER BY (custno ASC);
一旦我插入一些数据并运行nodetool flush
(强制它到磁盘),我将运行以下查询,翻转排序方向:
aaron@cqlsh:stackoverflow> SELECT album,token(album),band,custno,customer_name
FROM customers_by_album
WHERE album='Moving Pictures'
ORDER BY custno DESC;
当我查询分区键album
时,album
值Moving Pictures
被散列到令牌 7819329704333693835。节点 10.0.0.5 负责令牌 7819329704333693835,查询被发送到那里。假设行/键缓存未命中,Cassandra 前往该目录stackoverflow/customers_by_album-e2820d00d88311e9b9dc413ae9a4e561/
并找到适当的 SSTable 文件。
在文件中,它找到分区并开始顺序读取:
一旦请求的数据被读取,它现在必须反转它刚刚读取的数据的排序方向,返回以下结果:
album | system.token(album) | band | custno | customer_name
-----------------+---------------------+------+--------|---------------
Moving Pictures | 7819329704333693835 | Rush | 14 | Mitch
Moving Pictures | 7819329704333693835 | Rush | 13 | Jeff
Moving Pictures | 7819329704333693835 | Rush | 12 | Ted
Moving Pictures | 7819329704333693835 | Rush | 11 | Aaron
(4 rows)
与排序方向翻转相关的成本似乎微不足道。当我使用 运行该查询时TRACING ON
,我会在20.217ms 内得到结果。当我指定ORDER BY custno ASC
(ORDER BY 的排序方向与磁盘排序顺序匹配) 时,我会在10.98ms中得到结果。
现在想象在您的分区中存储数万行,拉回几十列,然后翻转排序方向。我曾与应用程序团队合作,他们对大型结果集进行查询,当乳清翻转排序方向时会超时。所以改变排序方向的“成本”肯定与读取的行数/列数成正比。
推荐阅读
- python - 使用 Python 3.x 在 Pandas 中使用零和常量值扩展/填充时间序列数据
- firebase - Flutter Firestore 将值保存为字符串
- ios - iOS - YouTube api 和全屏出现问题
- android - 使用多个 addChangeListener 时领域“无法创建异步查询”
- angular - Angular 6 ngx-bootstrap Datepicker 全局语言环境
- mysql - xamarin.android 中的 MySqlConnection.Open() 错误
- jenkins - Gitlab CI 中的实用程序作业独立于主管道
- r - 从非常大的 JSON Lines 文件 (R) 中读取前 1000 行
- javascript - 图表加载缓慢,第二个稍后加载
- c# - 如何使用 C# 在 PostgreSQL 中从表 1 中选择数据并插入表 2