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

标签 mysql query-optimization

我有一个包含数百万条记录的表,它们利用 EFF_FROM 和 EFF_TO 日期字段来对记录进行版本控制。

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

我仅将事件记录复制到表的测试版本中,应用程序的 SELECT 查询从 60 秒缩短到 3 秒。

我不一定要对每个 EFF_TO 日期进行分区。我不想增加开销,尤其是填充表的进程。我只想要对查询2099-12-31的记录进行优化,并且我希望性能是即时的。

有没有一种简单的方法可以做到这一点?或者我是否必须创建一个事件表和一个历史表?

最佳答案

Partition like function for a single set of data?

这有点矛盾,但是您询问的是如何将数据划分为两组数据,一组是 EFF_TO future 的数据,一组是过去的数据。

have an EFF_TO of 2099-12-31

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

如果它们为空,则分区会很简单。就目前情况而言,您将必须删除并重新创建分区 - 这是一项相当昂贵的操作(查看用于进行在线模式更新的工具)。

您可以通过创建多个分区来定义现在周围的时间段,然后定期在末尾添加一个分区并从开头删除一个分区,从而最大程度地减少影响。

application's SELECT query went from 60 seconds to 3 seconds.

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

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

关于MySQL:针对一组数据的类似分区函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28224710/

相关文章:

sql - SQLite中列的一部分上的索引

mysql - 在 Ruby Mysql 查询中使用变量

sql - 列式数据库优化与关系数据库优化有何不同?

sql - 用于检索 'most popular' 表行的高效数据库设计

MySQL:格式化字符串

mysql - 优化 5 表 SQL 查询(stores => items => words)

sql - 如何理解避免FULL TABLE SCAN

mysql - 嵌套连接合并 3 个表

java - 使用 java 反射映射包含其他对象的对象

mysql - 即使它具有一对一关系,也可以拆分一个表的数据吗?