MySQL: 单组数据类分区函数?
MySQL: Partition-like function for a single set of data?
我有一个有数百万条记录的 table,他们利用 EFF_FROM 和 EFF_TO 日期字段来对记录进行版本化。
99% 的情况下,当应用程序查询此 table 时,它只关心 EFF_TO 为 2099-12-31 的记录,或活动的记录而不是历史。
我只将活动记录复制到 table 的测试版本,应用程序的 SELECT 查询从 60 秒减少到 3 秒。
我不一定要在每个 EFF_TO 日期进行分区。我不想增加开销,尤其是填充 table 的进程。我只想要优化 2099-12-31 查询记录,我希望性能是即时的。
有没有直接的方法来做到这一点?还是我必须求助于创建活动 table 和历史 table?
Partition like function for a single set of data?
这有点矛盾,但是您问的是将数据分成两组,一组 EFF_TO 是未来的数据,另一组是过去的数据。
have an EFF_TO of 2099-12-31
设计错误 - 这些应该为空。
如果它们为空,则分区会很简单。就目前而言,您将不得不删除并重新创建分区——这是一项相当昂贵的操作(查看用于进行在线模式更新的工具)。
您可以通过创建多个分区定义现在左右的时间段,然后在末尾添加一个额外的分区并定期从开头删除一个分区来最大程度地减少影响。
application's SELECT query went from 60 seconds to 3 seconds.
除了 table
的大小之外,性能提高还有很多其他原因
- 如果它正在执行完整 table table 扫描,则这是应用程序中的设计错误。
- 您的索引可能没有及时更新
- 索引的逻辑结构可能不平衡,需要优化
- table 的物理结构和索引很多是碎片化的,需要优化
我有一个有数百万条记录的 table,他们利用 EFF_FROM 和 EFF_TO 日期字段来对记录进行版本化。
99% 的情况下,当应用程序查询此 table 时,它只关心 EFF_TO 为 2099-12-31 的记录,或活动的记录而不是历史。
我只将活动记录复制到 table 的测试版本,应用程序的 SELECT 查询从 60 秒减少到 3 秒。
我不一定要在每个 EFF_TO 日期进行分区。我不想增加开销,尤其是填充 table 的进程。我只想要优化 2099-12-31 查询记录,我希望性能是即时的。
有没有直接的方法来做到这一点?还是我必须求助于创建活动 table 和历史 table?
Partition like function for a single set of data?
这有点矛盾,但是您问的是将数据分成两组,一组 EFF_TO 是未来的数据,另一组是过去的数据。
have an EFF_TO of 2099-12-31
设计错误 - 这些应该为空。
如果它们为空,则分区会很简单。就目前而言,您将不得不删除并重新创建分区——这是一项相当昂贵的操作(查看用于进行在线模式更新的工具)。
您可以通过创建多个分区定义现在左右的时间段,然后在末尾添加一个额外的分区并定期从开头删除一个分区来最大程度地减少影响。
application's SELECT query went from 60 seconds to 3 seconds.
除了 table
的大小之外,性能提高还有很多其他原因- 如果它正在执行完整 table table 扫描,则这是应用程序中的设计错误。
- 您的索引可能没有及时更新
- 索引的逻辑结构可能不平衡,需要优化
- table 的物理结构和索引很多是碎片化的,需要优化