【发布时间】:2012-07-20 08:24:08
【问题描述】:
我正在做一个像 google adwords 这样的跟踪网站。我只做修改。在那个网站上,我看到他们正在为每个月创建表格并将该表格合并为一个表格,这是针对存储有关点击和搜索详细信息的表格以及具有大量记录的合并表格完成的。对于查询,他们只使用了合并的表,其中有数以亿计的记录。使用这样的表有什么好处吗?而且查询需要 10 多分钟才能执行。
【问题讨论】:
标签: php mysql database database-design
我正在做一个像 google adwords 这样的跟踪网站。我只做修改。在那个网站上,我看到他们正在为每个月创建表格并将该表格合并为一个表格,这是针对存储有关点击和搜索详细信息的表格以及具有大量记录的合并表格完成的。对于查询,他们只使用了合并的表,其中有数以亿计的记录。使用这样的表有什么好处吗?而且查询需要 10 多分钟才能执行。
【问题讨论】:
标签: php mysql database database-design
MRG_MYISAM 仅适用于 MyISAM 表,它们本身并不是表的第一个选项。您通常会选择 InnoDB 表。
MRG_MYISAM 引擎是在 MySQL 支持视图和分区之前发明的。范围分区(例如每月分区)很可能是您想要的。
就查询而言,分区对用户来说是透明的,但仍然使用pruning 以便仅从选定的分区中读取查询,从而对其进行优化。
我建议您使用 InnoDB 表,并查看 range partitioning。 MRG_MYISAM 和 MyISAM 仍在使用中。他们可以为你工作。只是 MyISAM 引入了太多麻烦(没有崩溃恢复、表级锁定等等……),以至于很多时候都无法解决。
【讨论】:
优点如下,如果你没有得到以下优点,请不要使用它。
轻松管理一组日志表。例如,您可以将不同月份的数据放到单独的表中,用 myisampack 压缩其中的一些,然后创建一个 MERGE 表将它们作为一个表来使用。
获得更快的速度。您可以根据某些条件拆分大型只读表,然后将各个表放在不同的磁盘上。以这种方式构建的 MERGE 表可能比使用单个大表快得多。
执行更有效的搜索。如果您确切知道要查找的内容,则可以仅在其中一个基础表中搜索某些查询,并为其他查询使用 MERGE 表。您甚至可以拥有许多使用重叠表集的不同 MERGE 表。
执行更有效的维修。修复映射到 MERGE 表的单个小表比修复单个大表更容易。
立即将多个表映射为一个。 MERGE 表不需要维护自己的索引,因为它使用各个表的索引。因此,MERGE 表集合的创建或重新映射速度非常快。 (创建 MERGE 表时仍必须指定索引定义,即使没有创建索引。)
如果您有一组表,您可以根据需要根据这些表创建一个大表,您可以根据需要从它们创建一个 MERGE 表。这速度更快,并且节省了大量磁盘空间。
超出操作系统的文件大小限制。每个 MyISAM 表都受此限制,但 MyISAM 表的集合不受此限制。
您可以通过定义映射到单个表的 MERGE 表来为 MyISAM 表创建别名或同义词。这样做应该不会对性能产生真正显着的影响(每次读取只有几次间接调用和 memcpy() 调用)。
您可以在basic info link、advantages disadvantages link 上阅读更多相关信息。
【讨论】: