将数据库表划分为时间范围(例如年)是否重要?

时间:2013-02-14 00:26:29

标签: php database database-design normalization

我刚刚开始创建一个mySQL数据库,我想弄清楚的一个问题是,'是否有必要将我的表更新为时间框?'。否则,如果5年后我会进行查询,我会从更大的表格中查询。我不确定SQL究竟是如何执行查询的,我不知道是否会因为它们离开表格而有任何严重的垮台......

实际上,我的表有一个日期列,是候选键的一部分,我已经实现了日期范围查询,但将所有内容都保存在一个表中是一件坏事吗? (我确实有至少3NF-4NF格式的多个表格)

我也看了this问题的答案,虽然我发现答案不是很详细,除了相对支持的答案之外没有给出太多解释。

2 个答案:

答案 0 :(得分:1)

关于此事,有一些关键点和过程。我将尝试回顾一些主要的architice模式。

SQL的问题开始于一个大约5M甚至更多的大行号。问题通常是缓慢的,如果您的数据库需要经常更新,假设每秒2000-3000次点击,这可能会导致您的服务器崩溃。

为避免繁重的慢查询,您需要映射公共表函数并将它们一般划分为SELECT和INSERT / UPDATE。

对于SELECT i recomand使用INNODB表来避免表锁定,并考虑运行一个Chron Procedure(一个将在您的服务器上自动运行的脚本),它将创建一个比生命周期表更短的时间段的表。这将确保一个小型的表格,可以快速工作。

如果您计划进行大量点击。我重新考虑这个想法将主表大小保持在15GB以下,决定从这一点起将有一个存档数据库的时间范围。每天从主表复制到小块的存档。确保存档的大小不受限制(选择正确的服务来实现这一点,例如,亚马逊的S3可以很好地存储SQL转储文件。但这不是一个你无法打开它的SQL服务器,你需要将它解压缩到SQL这可能需要很长时间。所以存档需要是一个SQL服务器) 存档模式 - 使用具有大量RAM(128-256 GB)4-8 CPU的SQL服务器,将表分成表格以显示时间范围。尽量保持每行20M行。

。创建主表的复制过程 - >一个只有读取用户许可的从属数据库。 现在,这个设置将确保您的表可以获取命中,它​​有备份,并且您将所有数据保存在存档中。另一个很棒的功能现在您可以将所有SELECT QUERIES发送到从属DB。它将确保您的SQL不会卡住,并且您可以使用它来创建YEAR,MONTH,DAY Aggreagate查询而不关心表大小。

此计划适用于任何免费版本的MYSQL以及我所知道的每台服务器。

如果你想要更多的robost解决方案和时间不是你的系统的主要问题我重新启动GOOGLE app引擎\ AMAZON云。无限存储和计算。

您可以通过慢查询日志检查您的性能,并修改您的数据库以保留更多表格以加快您的SQL。如果您将同一个表用于多个用户,我认为您可以查看Memcash解决方案,它们可以反复显示数据并节省连接和查询数据库的时间。

关于主要奴隶关系的几点:

因为您无法从您的奴隶(读取用户)删除,为了删除数据,您必须从主表中清除它。也许它之前并不清楚,但是当将数据存入存档时,您从从属设备中选择数据(同样不是加载重选)并复制它,然后从主表中删除这些数据。复制进程也会从slave中删除它。因此,当存档过程正在发生时,主要和从属几乎一直都是相同的。另一点是交通成本..如果奴隶和主要在同一台服务器上它会更便宜,但如果服务器宕机..所以你把它们放在一起。希望您将存档放在不同的服务器上。如果流量较少,您可以在不同的服务器上使用从站,并且可以全部备份以便显示数据。编码时,请确保如果数据不在主表中,您的代码可以获得存档并查看存档。

希望得到这个帮助。

答案 1 :(得分:0)

除非你正在处理非常大的数据集或一个5年未被触及的系统......否则你很可能在遇到问题时更改了数据库引擎,并且必须进一步对数据进行分片/分区

然而,这不知道数据集的上下文......