AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 302462
Accepted
Kekar
Kekar
Asked: 2021-11-12 02:13:08 +0800 CST2021-11-12 02:13:08 +0800 CST 2021-11-12 02:13:08 +0800 CST

Cassandra 中的查询性能改进

  • 772

我的 Cassandra 数据库中有一张桌子。

CREATE TABLE table (
    pk uuid,
    status int,
    location text,
    type text,
    id  text,
updatedtimestamp timestamp, 
        PRIMARY KEY (pk)
);

CREATE INDEX  tablelocation ON table (location);
CREATE INDEX  tabletype ON table (type);
CREATE INDEX  tableid ON table (id);
CREATE INDEX  tableupdatedtimestamp ON table (updatedtimestamp);

我运行的查询是:

Select * from table 
where location='A1' 
and type='T1' 
and status=001 
and id='NA' 
allow filtering;

Cassandra 需要超过 5 秒的时间来为该查询返回 4000 条记录。我已经在所有这些列上都有二级索引。根据 DBA,问题是id='NA'有条件的。此条件为真的行太多。

但是,这种情况是由于业务用例而存在的,如果没有其他机制来过滤该值,就无法删除该条件。

我正在考虑创建一个包含所有 4 列的新索引。但是,我担心它会妨碍写入性能。状态栏会非常频繁地更新。

我们可以做些什么来调整这个查询的性能吗?

query-performance performance-tuning
  • 2 2 个回答
  • 556 Views

2 个回答

  • Voted
  1. Best Answer
    Aaron
    2021-12-04T08:49:18+08:002021-12-04T08:49:18+08:00

    使用 Cassandra 进行索引永远不会高效,因为它不是设计的。Cassandra 的 4000 行并不是什么大问题。但是查询集群中所有节点的 4000 行,现在您已将网络时间添加到等式中。

    如果您希望执行此操作,您需要做的是构建一个表来支持此查询。具体来说,这意味着设计一个主键结构,以便查询可以由单个节点提供服务。

    根据位置和类型的基数,您可以尝试以下操作:

    CREATE TABLE table_by_location_type (
        pk uuid,
        status int,
        location text,
        type text,
        id  text,
        updatedtimestamp timestamp, 
        PRIMARY KEY ((location,type),id,pk)
    );
    
    CREATE INDEX  tablestatus ON table_by_location_type (status);
    

    location这将按和对您的数据进行分区type,确保该列组合上的数据将存储在一起。接下来,这会将您的数据(在每个分区内id)聚类,并pk在末尾添加 以确保唯一性。只要与and一起使用,索引就status可以了。locationtype

    专业提示:

    • 构建您的表格以适应您的查询。不是反过来。
    • 如果您需要支持多种查询模式,请构建第二个表并将数据复制到其中。
    • 二级索引是为了方便而不是性能而设计的。避免使用它们,除非您提供完整的分区键。
    • 永远不要在生产中使用该ALLOW FILTERING指令。
    • 2
  2. John K. N.
    2021-12-05T02:03:28+08:002021-12-05T02:03:28+08:00

    根据 Casandra CQL 文档ALLOW FILTER:

    默认情况下,CQL 仅允许不涉及对所有分区的完整扫描的选择查询。如果扫描了所有分区,则返回结果可能会遇到与表中数据量成比例的显着延迟。ALLOW FILTERING选项显式执行完整扫描。因此,查询的性能可能是不可预测的。

    参考: 数据操作(Cassandra 文档)

    所以ALLOW FILTERING从你的语句中删除指令SELECT...,看看性能是否有所提高。

    @Aaron 在他的回答中也指出了这一点:

    • 永远不要在生产中使用该ALLOW FILTERING指令。

    我刚刚从官方文档中添加了详细信息。

    • 1

相关问题

  • SQL从一个表中获取另一个表中的多个条目的ID

  • 带限制器的键/值表

  • 选择满足 n 个外键条件的行

  • 这种类型的查询的名称是什么,一个有效的例子是什么?

  • TOP 如何(以及为什么)影响执行计划?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve