当前位置: 首页 > 面试题库 >

低选择性色谱柱的索引和替代方法

壤驷志学
2023-03-14
问题内容

在低选择性色谱柱上选择记录的策略范围是什么?

一个示例可能是订单表,多年来,您在其中构建了大量已完成的订单,但经常需要选择活动订单。订单可能会经历生命周期,例如下达,分配库存,从仓库提货,发货给客户,开票并付款。订单可能会另外被取消,保留等。大多数记录最终将处于最终状态(例如已付款),但是您可能经常需要选择已分配的订单。在这种情况下,顺序读取将很慢。

关于对
MySQL进行索引的类似问题:低基数/选择性列=如何进行索引?
索引会吸收SQL吗?
什么是索引,如何使用它们来优化数据库中的查询?
定义索引:哪些列对性能有影响?
和许多其他的相关性逐渐降低。

我已经读过的方法(在stackoverflow和其他地方)包括

  • 使用位图索引
  • 使用部分索引(create index x on t(c2) where c1='a'
  • 使用聚集索引?
  • 不要索引低选择性的列,请使用顺序读取
  • 数据分区(例如,分成几个具有相同架构的表)
  • 使用补充表(例如 active_customers(customer_id)

我当前的DBMS不支持上面列出的前三个选项,其余的似乎有问题-还有其他常用的方法吗?

更新:我见过-为您的低选择性色谱柱建立索引,但只有为高选择性值进行选择。


问题答案:

我同意非理性的 不过 分支。但是,这种情况下有些事情要知道。

这称为歪斜和歪斜杀死。这对于部分索引是一种完美的用法,在该索引中,您将排除95%的已付款发票,而仅对更有趣和更具选择性的统计信息进行索引。但是你没有。您可以将所有行水平划分到单独的表/分区中,但随后需要考虑行迁移(从一种状态迁移到另一种状态),这很昂贵。DBMS必须执行更新,删除和插入才能更改状态。如果您使用的是大容量系统,那将会很痛苦。

忘记您关于是否基于选择性建立索引的说法,因为将索引放在快速变化的列上通常也是一个坏主意。您的索引将包含热块,其中所有步骤1都将被删除,另一个将所有步骤2都将被插入,并且顺便说一句,某些步骤2同时被删除到了步骤3中。这将无法很好地扩展。

我建议将您的状态垂直划分到一个单独的表中。

您的发票表将包含一个PK和除状态之外的所有列。

您可以通过两种方式处理您的身份。该表将具有PK值作为返回发票表的FK,状态以及您输入该状态时的时间戳。最好的是关于状态的水平分区表。您将为每个可能的状态分配一个分区。因此,找到全部或一个“已放置”状态将对修剪进行分区,并仅读取所需的分区-
这是很少的块。由于该行非常狭窄,因此您可能在单个块上获得400个发票状态。查找任何一张发票的状态都很容易,因为PK上有一个全局索引。

如果RDBMS不支持通过行迁移进行分区,则需要将这些分区作为表进行管理,然后从一个表中删除并插入另一个表中。您将把这些移动封装在一个过程的事务中,以便保持数据干净。每张发票都在一个且只有一个状态表中。较难的部分是按发票ID查询,您必须检查每个表以查看其位置。

您还有另一种选择。
您可以写或不写付费状态。如果它是分区表,则只需将其移至已付款状态,就可以从发票状态表中删除该发票。(当然,您会在奖金材料中提到的历史记录表中写一个付费记录)。然后,您将对状态表进行外部连接,并且null表示已支付。如果您几乎从未查询过付费状态,那么实际上没有理由进行快速查询。

奖金材料

无论哪种情况,您都希望在报告表中跟踪这些运动。每次更新状态时,您都希望将其写入历史记录表。最终,您将需要分析我所说的运输时间。从满额到有薪的平均时间是多少个月?由于经济不景气,这种情况会增加吗?从放置到填充的运输时间(以月为单位)是多少?夏季是否因为假期遗失身体而花费更长的时间?你明白了。通过更新该列,您将丢失这些答案,因此您需要将该历史记录日志嵌入到您的过程中。



 类似资料:
  • 问题内容: 我需要在表(列)中添加索引,并在这篇文章中偶然发现: 多少数据库索引太多? Quote:“话虽如此,您可以清楚地向表添加很多毫无意义的索引,这些索引不会执行任何操作。将B- Tree索引添加到具有2个不同值的列中将毫无意义,因为它在查找数据方面不会增加任何内容。列中的值越独特,则从索引中受益越多。” 如果只有两个不同的值,索引真的没有意义吗?给定如下表(MySQL数据库,InnoDB)

  • 主要内容:1 独立的列,2 前缀索引和索引选择性,3 多列(组合、联合)索引,3.1 多个单列索引的问题,3.2 使用多列索引,4 选择适合的索引列顺序,5 聚簇(聚集)索引,6 覆盖索引详细介绍了各种高性能的索引使用策略,比如联合索引、索引顺序、聚簇索引、覆盖索引等等,以及常见索引失效的情况。 前面我们已经介绍了各种类型的索引结构及其对应的优缺点: BTREE索引的数据结构以及具体实现原理深入解析 哈希索引的数据结构以及索引的优缺点 正确的创建和使用索引是实现高性能查询的基础。我们通常会看到一

  • 问题内容: 我想用逗号作为分隔符连接一个ArrayList。我找到了这个答案,指出可以在Java中使用。 但是,当我尝试使用此功能时,Android Studio出现以下错误: 无法解析方法’join(java.lang.String,java.lang.String,java.lang.String,java.lang.String)’ Android Studio是否有一个好的简洁的替代方法(

  • 问题内容: 我正在尝试仅使用来自多索引DataFrame的一个索引来创建新的DataFrame。 理想情况下,我想要这样的事情: 和: 本质上,我想删除除level之外的多索引的所有其他索引。是否有捷径可寻? 问题答案: 一种方法是简单地重新绑定到所需的MultiIndex级别。您可以通过指定要保留的标签名称来做到这一点: 或使用级别的整数值: MultiIndex的所有其他级别将在此处消失。

  • 这个问题可能非常愚蠢,但我不知道该怎么做 有一个带有N列的。我需要选择一些列,按列的索引引用,然后将所有值转换为数字,并在我的 我已经通过列名引用(比如完成了这项工作,但仍然坚持使用索引(比如 在这种情况下,对列引用的正确方法是什么?(python 2.7)

  • 在本章中,我们将讨论如何对日期进行切片和切块,并且通常会获得pandas对象的子集。 Python和NumPy索引运算符“[]”和属性运算符“。” 可以在各种用例中快速轻松地访问Pandas数据结构。 但是,由于要访问的数据类型不是预先知道的,因此直接使用标准运算符会有一些优化限制。 对于生产代码,我们建议您利用本章中介绍的优化的pandas数据访问方法。 熊猫现在支持三种类型的多轴索引; 下表中