MySQL“;手工制作;分割

MySQL“;手工制作;分割,mysql,sql,database,database-design,partitioning,Mysql,Sql,Database,Database Design,Partitioning,我最近继承了一个遗留应用程序,包括一个MySQL数据库,其核心是一个“表”,我们称之为Foo——只是它不是一个实际的表,而是许多相同的表,名为Foo01,Foo02。。。通过Foo31。记录插入到FooNN中,当该记录的月份为NN时,该“分区逻辑”在应用层进行管理 总体而言,Foo以每天约10万行的稳定速度增长。总计数(~3M)和行数据表明每个记录在大约一个月后都会被删除/历史化,所以大小不是一个大问题。随着时间的推移,插入以大致恒定的速率发生,更新不存在。对Foo的查询只会因为用户(不是很多)

我最近继承了一个遗留应用程序,包括一个MySQL数据库,其核心是一个“表”,我们称之为
Foo
——只是它不是一个实际的表,而是许多相同的表,名为
Foo01
Foo02
。。。通过
Foo31
。记录插入到
FooNN
中,当该记录的月份为
NN
时,该“分区逻辑”在应用层进行管理

总体而言,
Foo
以每天约10万行的稳定速度增长。总计数(~3M)和行数据表明每个记录在大约一个月后都会被删除/历史化,所以大小不是一个大问题。随着时间的推移,插入以大致恒定的速率发生,更新不存在。对
Foo
的查询只会因为用户(不是很多)进行手动搜索而发生,手动搜索可能通过“分区”日期过滤,也可能不通过“分区”日期过滤,也可能没有其他搜索参数

在我看来,这看起来非常像过去有人做了一个地狱般的过早优化,很可能加上一匙大胆的无知。但我不是什么专家,我只是想弄明白为什么有人会这样做


这种方法有意义吗?i、 e.与MySQL的内置分区相比,它是否有任何优势(使明显的劣势值得利用)?

您所描述的是一个典型的SQL反模式(换句话说,不是一个好的设计)。有许多缺点可以克服您可能获得的微小性能增益,其中最突出的是:

  • 需要多个表的查询编写起来很复杂
  • 强制执行数据完整性很难(表之间没有主键)
  • 结构的维护有问题(任何DDL操作都必须在所有表上重复)
如果您的数据不是太大,您可以将其直接存储在单个表中

如果它有很多行,可以使用MySQL进行本机分区


如果有许多列,但并非所有列都经常使用,则可以垂直拆分结构并在另一个表中分隔经常使用的列。

我将给出一些初步建议:

假设它是
按范围划分(到_天(…)
,这是唯一有用的模式

  • 更简单的查询供用户编写。日期和日期范围非常相似,只命中一个表(由用户查看)
  • 在切换到分区或从分区切换到分区时,通常需要重新设计索引。在这样做的过程中,您要么保持性能,要么获得性能
  • 删除“旧”数据要快得多,侵入性也小得多(比单个表),因为它是一个
    删除分区
    。(好的,foo####也是快速和无创的。)
从另一个角度来看,有句老话,“如果它没有坏,就不要修理它”


我对分区的评论:

我想知道这个数据库是在分区存在之前建立的吗?不这样认为@p.Salmon,MySQL已经有了至少十年的分区,我称这个应用程序为“legacy”,但它并没有那么旧。谢谢你的回答@GMB,我知道它的缺点,我看不到它的优点,所以我的问题是。如果您提到一个可能的(即使很小的)性能增益,您是否介意对此进行扩展?它与MySQL的内置分区相比如何?@willyjoker:从商业角度来看,可能没有什么好处。我想您可以通过重新设计来降低维护成本,但从业务角度来看,数据库可能已经足够好了。