0

我刚刚开始制作一个 mySQL 数据库,我想弄清楚的问题之一是,“是否有必要将更新我的表划分为时间范围?”。否则,如果 5 年后我进行查询,我将从一个更大的表中查询。我不确定 SQL 究竟是如何执行查询的,我不知道如果让表保持原样会不会有任何重大的失败......

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

我也看了看这个问题的答案,尽管我发现答案不是很详细,除了它是一个相对受支持的答案外,没有给出太多解释。

4

2 回答 2

1

关于这个问题有一些关键点和过程。我将尝试回顾一些主要的架构模式。

SQL 的问题从大约 5M 或更多的大行数开始。问题通常是慢查询,如果您的数据库需要不断更新,比如说每秒 2000-3000 次点击,这可能会使您的服务器崩溃。

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

对于 SELECT,我建议使用 INNODB 表来避免表锁定,并考虑运行 Chron 过程(将在您的服务器上自动运行的脚本),这将创建一个较小的表,该表将比生命周期表保存更短的时间段。这将确保一个小尺寸的桌子可以快速工作。

如果您计划制作大量热门歌曲。我建议这个想法将主表大小保持在 15GB 以下,确定从此时起将有一个存档数据库的时间范围。每天以小块从主表复制到存档。确保存档不受大小限制(选择正确的服务,例如亚马逊的 S3 可以很好地存储 SQL 转储文件。但这不是您无法打开的 SQL 服务器,您需要将其解压缩到 SQL这可能需要很长时间。因此存档需要是 SQL 服务器)存档模式 - 使用具有大量 RAM(128-256 GB)4-8 CPU 的 SQL 服务器,将表格分成表格以获取时间框架。尝试将其保持在 20M 行中。

. 创建一个到主表的复制过程 - >一个只有读取用户许可的从数据库。现在,此设置将确保您的表可以被点击,它有一个备份,并且您将所有数据保存在一个存档中。另一个很棒的功能是现在您可以将所有 SELECT QUERIES 发送到从数据库。它将确保您的 SQL 不会卡住,您可以使用它来创建 YEAR、MONTH、DAY 聚合查询,而无需考虑表大小。

这个计划适用于任何免费版本的 MYSQL 和我知道的每台服务器。

如果您想要更强大的解决方案并且时间不是您系统的主要问题,我推荐 GOOGLE 应用引擎\亚马逊云。无限的存储和计算。

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

关于主从关系的几点说明:

因为你不能从你的奴隶(读取用户)中删除,为了删除数据,你必须从主表中清除它。也许以前不清楚,但是当将数据放入存档时,您从从属设备中选择数据(同样不要加载大量选择)并复制它,然后从主表中删除这些数据。复制过程也会从从属设备中删除它。因此,当存档过程发生时,主要和从属几乎一直都是相同的。另一点是流量成本..如果从属服务器和主服务器在同一台服务器上,它会更便宜,但如果服务器出现故障..所以你把它们放在一起。希望您将存档放在不同的服务器上。如果流量较少,您可以在不同的服务器上使用从属服务器,并随时进行完整备份以显示数据。

希望这有帮助。

于 2013-02-14T00:50:48.230 回答
0

除非您正在处理非常大的数据集或 5 年内不会被触及的系统......当您遇到问题并且必须进一步对数据进行分片/分区时,您很可能已经更改了数据库引擎。

这是在不知道您的数据集的上下文的情况下...

于 2013-02-14T00:31:35.610 回答