将大量相同的MySQL表转换为一个和许多指向它的VIEW?

时间:2011-09-08 15:27:23

标签: mysql views innodb myisam

我正在运行一个相当大的WPMU(Wordpress多用户,Wordpress多站点)部署,它使用了4096个数据库和100k +表(显然在模式方面有很多重叠)。

基本上它是相同的20个 - 每个博客一遍又一遍地复制的表,其中一些是空的,另一些包含几行到几百行。

我的计划(节省了许多麻烦,但可能效率低下)是将所有相同模式表合并到一些大型InnoDB表中,并用指向它们的MySQL VIEW替换旧表,重写查询以便返回相关的行(将旧表名存储在新列中,然后使用视图将列添加到查询WHERE子句中)。

问题是:这会在性能方面提供任何改进吗? (密钥缓冲效率,表缓存效率,索引)或者这只是蛇油,我应该采用更加激烈的方法重写应用程序,以便我不需要VIEW但查询直接进入大型InnoDB表?

1 个答案:

答案 0 :(得分:3)

我建议不要做你正在考虑的表合并。

考虑合并表格的一些缺点:

  • 合并表的索引数据结构将更大更深,因此效率较低。
  • 积累大量数据但随后闲置的博客仍然会影响表和索引的整体大小,因此查询会花费更长时间。
  • 更难备份和恢复个人博客。
  • 如果要扩展,请将单个博客移动到另一个数据库服务器。
  • 更难使用SQL权限来限制给定博客的访问权限(尽管您可以将SQL权限应用于视图)。
  • 更难添加包含特定博客架构更改的自定义功能。

使用视图或不使用视图不会对上述问题产生积极或消极影响。至少在MySQL中,视图基本上只是运行时的查询重写,它不会比直接查询基表更好或更差地使用索引。

我曾经与Wordpress.com的数据库架构师交谈过。他们在数十个数百个物理服务器上托管了数百万个Wordpress博客。在他们早期,他们开始将所有博客的数据合并到相同的表中,但他们发现随着他们的成长,操作困难变得太大了。现在,他们将每个博客托管在一个单独的数据库中。