mysql - 按月和年创建sql表

标签 mysql sql t-sql bigdata

每个月我都会收到外部公司发送的一个文件,该文件需要存储在数据库中,每个文件最多包含一百万条记录。主要数据字段为月、年、邮政编码和交易类型。

我建议我们每个月都应该将数据库中的数据保存为一个新的 SQL 表,这样我们就知道每个表中的数据量是有限的。然而我的一位同事说,他曾经被告知每月创建一张新表是不好的做法,但他不知道为什么。

如果我有多个表,最多只会有 60 个表,尽管表的数量可能要少得多(低至 12 个),具体取决于我的客户需要查看多远的过去。这意味着每个月我都需要删除一个月的数据。

但是,当我执行 SQL 查询时,每个查询只需要单个表中的一行数据。我认为从理论上讲,这比使用一个包含数百万行的表更有效。

我想知道是否有人有任何明确的理由来解释为什么以这种方式分割数据是一件坏事?

最佳答案

出于以下原因,所有“类似”项目应一起存储在数据库中:

  • 您应该能够使用单个 SELECT 提供项目的任何子集。仅通过更改 WHERE 来声明该声明的条款。对于单独的表,您必须编写代码将请求分解为计算表名称的部分和过滤该表的部分。您必须在每个应用程序中复制该逻辑,或者将其教授给每个想要使用您的数据库的用户。

  • 您不应人为限制数据的用途。如果您有单独的每月表,那么您已经大大限制了可以针对它们输入的查询类型,而无需编写更复杂的 UNION查询。

  • 向数据库添加更多已知数据类型的实例不需要 ALTER数据库的结构,并且作为一般原则,定期运行的代码甚至不应该有 ALTER权限

  • 如果维护了正确的索引,则 SELECT 时的性能差异非常小。从比较小表大 60 倍的表中获取数据。 (INSERTUPDATE 命令可能会产生更多影响,但听起来您将进行批量更新而不是不断更新数据)。

我只能想到将数据分片到单独的表中的两个原因:

  • 您发现存在无法通过更好的数据设计解决的性能问题。

  • 您拥有不同安全级别的记录,并且依赖 GRANT SELECT允许某些用户以更高安全级别查看记录的权限。

关于mysql - 按月和年创建sql表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33550482/

相关文章:

php - Mysql + php 带有特殊字符,如 '(Apostrophe) and "(引号)

mysql - Sails 不会填充大型查询

sql - 存储可变数量首选项的最佳方式?

sql - 在 SQL Server 中将多行视为一项

sql - 在 SQL Server 存储过程中使用带有通配符的单词列表

sql-server-2008 - UNPIVOT 如何为每个 ID 添加增量行号

SQL Server ROUND 不工作

php - MYSQL+PHP : Array Processing?

mysql - Mysql 中的 Error#1221 是什么,是这个 SqlQuery 中的基本问题?

mysql - 如何使无引号、逗号分隔的 ID 列表适用于 MySQL 中的 IN 子句