【发布时间】:2014-11-20 15:15:49
【问题描述】:
我有一张表,其中包含过去 n 天的记录。该表中的记录约为 1 亿条。我需要找到最后k个没有更新的记录
我对这个问题的解决方案是
在 k1 上对表进行分区。时间戳列的索引。现在不要更新时间戳(以便不重建索引),而是执行删除 + 插入。通过这样做,我认为查找过去 k 天内未更新的记录的查询会很快。
还有其他更好的方法来优化这些操作吗?
例如,
假设我们有很多用户,每个用户可以使用不同的产品。用户也可以随时开始使用(成为所有者)新产品。如果用户在 n 天内未使用产品,他的所有权将到期。现在我们需要找到一个用户在过去 k 天内没有使用过的所有产品。用户数量为10000个订单,他可以选择的产品数量为100,000个订单。
我使用具有 (user_id, product_id, last_used) 架构的表对这个问题进行了建模。 product_id 是用户正在使用的产品的 ID。每当用户使用产品 last_used 时都会更新。此外,如果用户在 n 天内未使用产品,用户对产品的所有权也会过期。我在 user_id 上的表上分区并索引 last_used(timestamp)。我也没有更新,而是执行了删除+创建。我进行了分区和索引以优化查询以获取用户在过去 k 天内未更新的记录。
有没有更好的方法来解决这个问题?
【问题讨论】:
-
您已经很好地描述了设置,但请进一步描述问题。您正在删除超过 x 天的记录并且它会影响读取访问权限?您一次要删除多少条记录?典型的删除查询是什么样的?创新数据库?删除记录时不会对索引进行任何“重建”,只是对其进行一些更新。
-
请举例说明您希望从查询中得到的结果。
-
什么是主键?你想做什么?
-
@MarcusAdams 假设我们有一个用户表(user_id、product_id、last_used)。 product_id 是用户正在使用的产品的 ID。每当用户使用产品 last_used 时都会更新。用户也可以随时开始使用新产品。现在我需要为一个用户找到他在过去 k 天内没有使用过的所有产品。此外,如果用户在 n 天内未使用产品,用户对产品的所有权也会过期。如果索引在 last_used 并且 last_used 被修改,则索引将被“重新构建”。
-
这张表还有什么?还是只有这三列?
标签: mysql optimization query-optimization