【问题标题】:MySQL / MariaDB partitioning for Laravel softdeleteable (deleted_at IS NULL vs datetime value)Laravel softdeleteable 的 MySQL / MariaDB 分区(deleted_at IS NULL vs datetime value)
【发布时间】:2020-06-12 19:07:11
【问题描述】:

Laravel Eloquent softdeleteable(有时称为 softdeletable)表如下所示:

id | value1 | value2 | ... | valueN | deleted_at

对于活动条目,deleted_at 将是 null,对于已删除条目,将是日期时间值。

将 InnoDB 表划分为活动记录和已删除记录是否可行/可取?

(意味着所有空值的分区和任何实际值的另一个分区)

更新:经过一番研究,这是我想出的分区:

ALTER TABLE `listings`
PARTITION BY RANGE( UNIX_TIMESTAMP(deleted_at) )
SUBPARTITION BY HASH( user_id )
SUBPARTITIONS 40
(
    PARTITION active VALUES LESS THAN (0), -- null values (not deleted rows) will go here
    PARTITION deleted VALUES LESS THAN MAXVALUE -- non-null values (deleted rows) will go here
);

更新 2: 用户永远不会被软删除。房源会。他们最终会积累比活跃列表更多的已删除列表。 用户可以在任何列的过滤器上定义和组合任何数字(以 Excel 方式)。 user_iddeleted_at < 0(根据 EXPLAIN PARTITIONS 将修剪分区,而 IS NULL 不会)将始终出现在查询中。 我认为分区总是会减少要检查的行数,有时查询会受益于使用剩余的索引之一。我不确定我是否正确。

【问题讨论】:

    标签: mysql mariadb partitioning


    【解决方案1】:

    PARTITIONing 很少有助于提高性能。

    这个

    WHERE deleted_at IS NULL
      AND ...
    

    将受益于复合索引:

    INDEX(deleted_at, ...)
    

    “...”部分以某种方式匹配。

    (请注意这是因为IS NULL 的工作方式类似于=。也就是说,这样的索引在说deleted_at IS NOT NULL不会有帮助。这在deleted_at BETWEEN ... AND ... 中不是很有用.)

    向我们展示一些真实的查询;可能还有更多提示要分享。

    不使用分区的索引:

    PRIMARY KEY(user_id, id), -- perfect for finding one user
    INDEX(id)   -- to keep auto_increment happy
    

    如果user_id是唯一的,则完全摆脱id

    您是否需要查找所有(或在其中搜索)已删除的用户?

    【讨论】:

    猜你喜欢
    • 2022-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-04
    相关资源
    最近更新 更多