MySQL:一组数据的类似分区的函数?

时间:2015-01-29 21:14:33

标签: mysql query-optimization

我有一张包含数百万条记录的表,他们使用EFF_FROM和EFF_TO日期字段来记录这些记录。

99%的情况下,当应用程序查询此表时,它只关注EFF_TO为2099-12-31的记录,或者是活动而非历史记录。

我只将活动记录复制到表的测试版本,应用程序的SELECT查询从60秒复制到3秒。

我不一定要对每个EFF_TO日期进行分区。我不想将这种开销添加到填充表的进程中。我只想用2099-12-31查询记录的优化,我希望性能是即时的。

有直接的方法吗?或者我是否必须求助于创建活动表和历史表?

1 个答案:

答案 0 :(得分:1)

  

分区就像单个数据集一样?

这是任何矛盾的事情,但是你要问的是分成两组数据,一组是EFF_TO,另一组是过去。

  

的EFF_TO为2099-12-31

设计错误 - 这些应该为空。

如果它们为null,则分区将很简单。按照目前的情况,您将不得不删除并重新创建分区 - 这是一项非常昂贵的操作(查看用于进行在线架构更新的工具)。

您可以通过创建多个分区来最小化影响,这些分区定义NOW周围的时段,然后在末尾添加一个额外的分区,并定期从开头删除一个。

  

应用程序的SELECT查询从60秒到3秒。

还有很多其他原因可以提高性能,而不仅仅是表格的大小

  • 如果它正在进行全表扫描,这是应用程序中的设计错误。
  • 您的索引可能不是最新的
  • 索引的逻辑结构可能不平衡且需要优化
  • 表的物理结构和索引很多都是碎片化的,需要优化