mysql选择性低的列怎么加索引_sql – 低选择性列的索引和替代

我同意Unreason的分支.但是有一些事情需要了解这个案例.

这称为歪斜和歪斜杀戮.这是部分索引的完美用途,您可以排除95%的付费发票,并仅索引更有趣和有选择性的统计数据.但你没有那个.您可以将所有行水平分区为单独的表/分区,但是您需要考虑行迁移(从一个状态移动到另一个状态),这很昂贵. DBMS必须执行更新,删除和插入以更改状态.如果你是一个会伤害的高容量系统.

忘记你所说的是否基于选择性进行索引,因为在快速变化的列上放置索引通常也是一个坏主意.您的索引将具有热块,其中所有步骤1被移除,而另一个步骤2的所有步骤被插入,而且,顺便说一下,某些步骤2将被同时移除到步骤3中.这不会很好地扩展.

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

您的发票表将包含PK以及除状态之外的所有列.

您的状态可以通过两种方式处理.该表将PK值作为FK返回到发票表,状态和您输入该状态时的时间戳.最好的是状态上的水平分区表.您将为每种状态分配一个分区.因此,找到所有或一个“已放置”状态将分区修剪并只读取它所需的分区 – 这是一个非常少的块.由于行太窄,因此您可能会在一个块上获得400个发票状态.查看任何一张发票的状态很容易,因为PK上有一个全局索引.

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

你有另一种选择

您可以编写付费状态.如果它是分区表,您只需在发票状态表中移动到付款时删除该发票. (当然,您可以将付费记录写入奖励材料中提到的历史记录表).然后你将对状态表进行外连接,并且null表示已付费.如果您几乎从不查询付费状态,那么实际上没有理由进行快速查询.

奖金材料

在任何一种情况下,您都希望在报告表中跟踪这些移动.每次更新状态时,您都希望将其写入历史记录表.最后,您需要分析我称之为运输时间的内容.按月填写到付费的平均时间是多少?由于经济不景气,这种情况会增加吗?从月份到装满的运输时间是多少.由于度假时身体缺失,夏季月份需要更长时间吗?你明白了.通过更新该列,您将丢失这些答案,因此您需要将该历史记录日志嵌入到您的过程中.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值