如何正确选择与索引匹配的分区键

     2023-03-17     178

关键词:

【中文标题】如何正确选择与索引匹配的分区键【英文标题】:How to properly select partition keys that match an index 【发布时间】:2019-06-04 03:25:52 【问题描述】:

我尝试在索引列中选择包含至少一行具有特定值的分区键。

使用当前解决方案可以满足所有其他要求:

能够根据办公室选择报告。 给定办公室,可以使用类型和日期范围进行选择。 无需根据日期选择报告,无需排放办公室和/或报告类型。

最后,我需要能够选择某个用户已创建报告的所有办公室。根据 cassadra 文档,我在用户列上添加了一个索引。

表定义为:

create table report(
    office uuid,
    type text,
    insert_date timestamp,
    ...
    created_by uuid,
    ...
    primary key(office, type, insert_date));
create index created_by_idx on report (created_by);

如果我没记错的话,使用该索引就像有一个如下描述的辅助表:

create table report2(
    created_by uuid,
    office uuid,
    type text,
    insert_date timestamp,
    ...
    primary key(created_by ,office, type, insert_date));

我可以成功运行如下查询: select office from report where created_by = ? 但这会导致多行具有相同的办公室密钥,这是正确的:每个用户可以在每个办公室创建多个报告。

现在我在软件级别过滤重复的办公室,但我问自己是否可以在提取过程中直接过滤这些数据。

我试过了: select distinct office from report where created_by = ? 这导致 SELECT DISTINCT with WHERE clause only supports restriction by partition key and/or static columns.

然后我尝试: select office from report where created_by = ? group by office 这给了我正确的结果,但发出警告: Aggregation query used without partition key

这可能是个问题吗?如何处理 cassandra 这样的查询,在这种情况下可以忽略此警告吗?最后,真的是一个更好的选择,使用这样的查询来对抗 select * ... 有相同的 where 子句吗?

【问题讨论】:

【参考方案1】:

Cassandra 不支持您描述的功能是有原因的——因为它可能效率低下:

首先,二级索引必须确实列出所有匹配的行键,而不仅仅是不同的匹配分区键。这是因为您可能会要求所有行,而不仅仅是不同的分区键,所以数据必须在那里。必须将这些数据保存在索引中的另一个原因是每个单独的行都可能被单独删除(或过期),因此 Cassandra 需要跟踪所有这些数据以确定整个分区是否仍然存在或不再存在。

现在,由于我们已经在搜索结果列表中列出了所有行的键,因此仅输出“不同”分区键是一种低效的操作...如果您在一个分区中有一百万个匹配行,Cassandra 将需要在只输出一个结果之前扫描所有这些。 Cassandra 通常不会让用户以低效的操作击中自己的脚(例如,看看如何需要“ALLOW FILTERING”来明确允许在 SELECT 查询中进行低效过滤)。

话虽如此,未来的 Cassandra 版本应该允许您请求的“SELECT DISTINCT”请求是有道理的,也许要求用户说“ALLOW FILTERING”以确认它可能很慢。此外,另一种实现可能涉及较慢的更新(每行更新都会检查分区的活跃度),然后是快速读取。 Scylla 考虑过这样的实现,但也没有实现(参见https://github.com/scylladb/scylla/issues/3435)。

【讨论】:

:分区(代码片段)

...键的散列分区一致性哈希负载倾斜与消除热点分片与次级索引基于文档的二级索引进行分区基于关键词(Term)的二级索引进行 查看详情

如何循环这个索引匹配?

】如何循环这个索引匹配?【英文标题】:HowcanIloopthisindexmatch?【发布时间】:2018-07-1810:45:55【问题描述】:好的,所以我在这里有一个宏,它在AB和AC列中使用索引匹配函数填充单元格。(这部分很好)然后,通过将这些值与这... 查看详情

如何将列名与字典键匹配并向计数器添加值

】如何将列名与字典键匹配并向计数器添加值【英文标题】:Howtomatchcolumnnameswithdictionarykeysandaddvaluetocounter【发布时间】:2020-09-2504:38:05【问题描述】:我为每个单元格创建了一个具有二进制值的数据框,其中每一行是用户,每... 查看详情

如何使用 Django 功能而不是所有键来索引刚刚选择的 json 键?

】如何使用Django功能而不是所有键来索引刚刚选择的json键?【英文标题】:HowtoindexjustselectedjsonkeyusingDjangofunctionalityinsteadofallkeys?【发布时间】:2020-04-1418:57:10【问题描述】:我有下一个模型:fromdjango.contrib.postgres.fieldsimportJSONFi... 查看详情

如何使用与日期键匹配的字典填充表格视图

】如何使用与日期键匹配的字典填充表格视图【英文标题】:Howtopopulatetableviewwithdictionarythatmatchesthekeyfordate【发布时间】:2020-04-0717:34:51【问题描述】:我知道标题令人困惑,但我有一本字典,其中包含日期(字符串)键和事件... 查看详情

选择名称与正则表达式匹配的列

...namesmatchregex【发布时间】:2014-07-1402:22:13【问题描述】:如何使用逻辑索引(或任何其他有效方法)来选择列名包含与正则表达式匹配的列。例如,raw=\'\'\'id0_date0_hr1_date1_hr1a21-Jan302-Mar75\'\'\'importpandasaspdfromStringIOimportS 查看详情

您如何优化这个复杂的 sql 查询,然后选择正确的表索引

】您如何优化这个复杂的sql查询,然后选择正确的表索引【英文标题】:Howdoyouapproachoptimizingthiscomplexsqlquerythenchoosingpropertableindex\'s【发布时间】:2011-07-2404:11:40【问题描述】:我有一个复杂的查询,我似乎无法使用适当的索引... 查看详情

oraclelivelabs实验:automaticpartitioninginautonomousdatabase(代码片段)

...您执行手动分区时,您必须分析您的工作负载并选择如何将分区应用于表和索引以提高应用程序的性能。自动分区使自治数据库用户能够从分区中受益,而无需执行手动模式和工作负载分析。自动分区使用单列分区键与... 查看详情

选择数据库中的 php 表 <th> 和 <td> 但它们在正确的索引位置不匹配

】选择数据库中的php表<th>和<td>但它们在正确的索引位置不匹配【英文标题】:phptable<th>and<td>fromDatabaseSelectedbuttheyarenotMatchingintherightindexingposition【发布时间】:2021-12-0500:30:49【问题描述】:所有开发人员。我... 查看详情

如果用户输入的与输入的数组匹配,在 C++ 中如何返回数组的索引?

】如果用户输入的与输入的数组匹配,在C++中如何返回数组的索引?【英文标题】:InC++howtoreturnindexofanarrayifuserenteredmatchesenteredarray?【发布时间】:2009-08-2902:35:39【问题描述】:我想知道如果用户输入的数组与输入数组匹配,我... 查看详情

如何通过索引检查数组对象中的答案?

】如何通过索引检查数组对象中的答案?【英文标题】:HowdoIcheckanswersinarrayobjectsbyitsindex?【发布时间】:2022-01-0409:15:25【问题描述】:我正在尝试用JavaScript构建一个测验。我有一个带有问题、答案和正确答案的对象。我可以通... 查看详情

索引匹配最大/最小分数 (Java)

...够使用两个if语句在两个句子中获得适当的值,但是对于如何使我的索引正确以将名称与最大和最小分数对齐,我有点困惑。除了数组和索引之外,我无法使用类或其他/不同的方法。/ 查看详情

如何查找与嵌套键 laravel mongodb jenssegers 匹配的记录

】如何查找与嵌套键laravelmongodbjenssegers匹配的记录【英文标题】:Howtofindrecordmatchingthenestedkeylaravelmongodbjenssegers【发布时间】:2018-04-0819:43:35【问题描述】:我在laravel中使用jenssegersmongodb包来查询mongodb。如何在下面的json文档中... 查看详情

h2 如何在 Join 中选择正确/错误的索引

】h2如何在Join中选择正确/错误的索引【英文标题】:howh2choosesright/wrongindexinJoin【发布时间】:2018-04-2710:18:49【问题描述】:我遇到了namedqueryinJava的问题,但问题出在H2中。我认为ANALYZE是我的解决方案,可以解决我的问题。它在... 查看详情

使用分区键和索引的 DynamoDB 搜索

】使用分区键和索引的DynamoDB搜索【英文标题】:DynamoDBsearchusingpartitionkeyandindex【发布时间】:2020-03-1022:53:03【问题描述】:我还没有看到使用分区键和index(python,boto方式)进行DynamoDB搜索的示例。是否可以指向任何链接/示例... 查看详情

取消选择数据表行后如何正确删除数组中的索引或值?

】取消选择数据表行后如何正确删除数组中的索引或值?【英文标题】:Howproperlyremoveanindexorvalueinaarrayafterdeselectdatatablesrow?【发布时间】:2018-10-2919:31:52【问题描述】:我正在通过连续选择然后将Id附加到隐藏字段中来处理示例j... 查看详情

重建主键索引为非压缩索引

重建主键索引为非压缩索引删除约束的同时删除该约束对应的索引数据库:Oracle11.2.0.4因为项目需要,需要将一个主键索引由压缩索引改为非压缩索引这里的index_name代表了主键名称,也代表主键索引名称,两个同名坑1dropindexindex... 查看详情

如何创建唯一索引

例如,如果计划频繁查询employee表中(其中主键为emp_id)的身份证号码(ssn)列,并希望确保身份证号码是唯一的,则可以在ssn上创建唯一索引。如果用户为一个以上的雇员输入相同的身份证号码,则数据库将显示错误而且无法保... 查看详情