MySQL:将大表拆分为分区或单独的表?

2023-12-10

我有一个包含 20 多个表的 MySQL 数据库,但其中一个非常大,因为它从不同的传感器收集测量数据。它的磁盘大小约为 145 GB,包含超过 10 亿条记录。所有这些数据也被复制到另一台 MySQL 服务器。

我想将数据分成更小的“碎片”,所以我的问题是以下哪种解决方案更好。我会使用记录的“时间戳”将数据除以年份。几乎所有在此表上执行的 SELECT 查询都在查询的“where”部分包含“timestamp”字段。

因此,以下是我无法决定的解决方案:

  1. 使用MySQL分区并按年份划分数据(例如partition1 - 2010,partition2 - 2011等)
  2. 创建单独的表并按年份划分数据(例如测量_2010、测量_2011 等表)

还有我不知道的其他(更新的)可能选项吗?

我知道在第一种情况下,MySQL 本身会从“分片”获取数据,而在第二种情况下,我必须为其编写一种包装器并自己完成。对于第二种情况,是否有其他方法可以使所有单独的表被视为“一个大表”来从中获取数据?

我知道这个问题过去已经被问过,但也许有人提出了一些新的解决方案(我不知道)或者最佳实践解决方案现在已经改变。 :)

非常感谢你的帮助。

Edit:

该架构与此类似:

device_id (INT)
timestamp (DATETIME)
sensor_1_temp (FLOAT)
sensor_2_temp (FLOAT)
etc. (30 more for instance)

所有传感器温度每分钟在同一时刻写入一次。请注意,大约有 30 个不同的传感器测量值连续写入。这些数据主要用于显示图表和其他一些统计目的。


好吧,如果你希望得到一个新的答案,那就意味着你可能已经阅读了我的答案,而我听起来就像一张破唱片。看分区博客对于分区可以提高性能的少数用例。你的确实如此not听起来像这 4 种情况中的任何一种。

Shrink device_id. INT是 4 个字节;您真的拥有数百万台设备吗?TINYINT UNSIGNED为 1 个字节,范围为 0..255。SMALLINT UNSIGNED为 2 个字节,范围为 0..64K。这将使桌子缩小一点。

If your real问题是如何管理这么多数据,那么让我们“跳出框框思考”。请继续阅读。

绘图...您要绘制什么日期范围?

  • “最后”一小时/天/周/月/年?
  • 任意的小时/天/周/月/年?
  • 任意范围,与日/周/月/年界限无关?

你在画什么图形?

  • 一天的平均值?
  • 一天中的最大/分钟?
  • 日或周的烛台(等)或其他?

无论哪种情况,您都应该构建(并增量维护)包含数据的汇总表。一行将包含一小时的摘要信息。我会建议

CREATE TABLE Summary (
    device_id SMALLINT UNSIGNED NOT NULL,
    sensor_id TINYINT UNSIGNED NOT NULL,
    hr TIMESTAMP NOT NULL,
    avg_val FLOAT NOT NULL,
    min_val FLOAT NOT NULL,
    max_val FLOAT NOT NULL
    PRIMARY KEY (device_id, sensor_id, hr)
) ENGINE=InnoDB;

一个汇总表可能为 9GB(对于当前数据量)。

SELECT hr,
       avg_val,
       min_val,
       max_val
    FROM Summary
    WHERE device_id = ?
      AND sensor_id = ?
      AND hr >= ?
      AND hr  < ? + INTERVAL 20 DAY;

将为您提供 480 小时的高/低/平均值;足够绘制图表吗?从汇总表中抓取 480 行比从原始数据表中抓取 60*480 行要快得多。

一年内获取类似的数据可能会让绘图包感到窒息,所以它may值得建立一个摘要的摘要——并以一天的决心。大约是0.4GB。

有几种不同的方法来构建汇总表;在你思考它的美丽并阅读之后我们可以讨论这个问题汇总表博客。收集一小时的数据,然后扩充汇总表可能是最好的方法。这有点像讨论的触发器我的暂存表博客.

而且,如果您有每小时的摘要,您真的需要每分钟的数据吗?考虑把它扔掉。或者,也许是一个月后的数据。这导致使用分区,但是只是为了删除旧数据的好处正如“案例1”中所讨论的分区博客。也就是说,您将拥有每日分区,使用DROP and REORGANIZE每天晚上都会移动“Fact”表的时间。这将减少您的 145GB 占用空间,但不会丢失太多数据。新足迹:约12GB(每小时摘要+过去30天的每分钟详细信息)

PS:摘要表博客展示如何获得标准差。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MySQL:将大表拆分为分区或单独的表? 的相关文章

  • 自动递增和最后插入 ID

    我在用着AUTO INCREMENT我想获取插入行的 ID 以便我可以使用更新另一个表ID作为两个表之间的公共字段 我明白LAST INSERT ID会排在最后ID 然而 我担心的是 数据库被许多用户同时访问 因此 可能有另一个进程访问该表
  • System.IndexOutOfRangeException:索引超出了数组的范围[重复]

    这个问题在这里已经有答案了 我正在开发一个 ATM 软件作为家庭作业 我想知道今天处理的交易总量 为此我编写了以下代码 public decimal getDayTransaction int accountid string date s
  • MySQL - 通过部分单词匹配和相关性评分进行高效搜索(全文)

    如何进行 MySQL 搜索 既匹配部分单词 又提供准确的相关性排序 SELECT name MATCH name AGAINST math IN BOOLEAN MODE AS relevance FROM subjects WHERE M
  • java.sql.SQLException:已经关闭

    我们有一个在 Tomcat 上运行的 Web 应用程序 带有 MySQL 后端 有一段时间一切都很好 然后突然我们开始遇到这个异常java sql SQLException Already closed 整个堆栈跟踪是 DEBUG org
  • Cassandra 与 ZooKeeper 的事务 - 这有效吗?

    我正在尝试在 ZooKeeper 的帮助下为 Cassandra 实现一个事务系统 由于我认为我在数据库实现方面没有足够的经验 所以我想知道我的想法原则上是否可行 或者是否有任何重大缺陷 以下是步骤的高级描述 识别所有要编辑的行 键 和列
  • Hibernate HQL Join 查询 DOT 节点,没有左侧

    我有两个模型类 应用程序 java Entity Table name Application catalog mysqldb XmlRootElement public class Application extends BaseObje
  • 开发 WordPress 管理链接重定向到实时站点

    我正在尝试对我拥有的 WordPress 网站进行新的更改 所以我复制了所有文件并导出到新的开发子域 为子域创建新数据库并从实时站点导入数据库 直播站点 http mysite com http mysite com 开发站点 http d
  • 子查询在多项选择时返回超过 1 个值的 SQL 错误

    我想要一个临时表 它将使用 select 语句插入值 但每次我运行查询时 总是出现错误 子查询返回超过 1 个值 当查询跟随 gt 或子查询用作表达式时 不允许这样做 该语句已终止 0 行受影响 这很奇怪 因为代码中似乎没有错误 但如果有的
  • 分区表查询仍然扫描所有分区

    我有一个包含超过十亿条记录的表 为了提高性能 我将其分区为30个分区 最常见的查询有 id 在他们的 where 子句中 所以我决定对表进行分区id column 基本上 分区是这样创建的 CREATE TABLE foo 0 CHECK
  • Session_set_save_handler 未设置

    我在设置 session set save handler 时遇到问题 我将 php ini 配置为 session handler user 这个简单的测试失败了 Define custom session handler if sess
  • 如何优化这个查询(涉及4毫米表)

    我正在使用如下所示的遗留数据库架构 product table表有字段 uid 整数 主键 name varchar 50 category表有字段 uid 整数 主键 name varchar 50 好吧 现在product table与
  • 为什么MongoDB不使用复合索引进行查询?

    以下是我对此集合的复合索引和单一索引 db Collection getIndexes 1 v 2 key id 1 name id ns service Collection 2 v 2 key FirstId 1 SecondId 1
  • MySql 西班牙语字符数据

    我有一个包含西班牙语字符的数据库 为了填充数据库 我从字符编码 UTF 8 的客户端页面获取值 当我在 mySql 数据库中插入值时 行包含更改的数据 例如 如果我插入 M xico 数据库中的条目是 M xico 其影响是当我对指定 M
  • mysql 将 varchar 字段排序为整数

    我的表中有一个 varchar 字段 我想对其进行排序 但我需要将此字段作为整数处理 意思是如果按文本排序 顺序是 19 2 20 但我想得到正确的顺序 2 19 20 谁能帮我 我不知何故没有设法运行查询CAST 我总是得到Error C
  • MySql 5.7 函数 UUID() 默认排序规则 - 非法混合排序规则

    Problem MySQL uuid 默认排序规则与配置连接排序规则不进行比较 我有一个使用字符集创建的数据库 表 字段 utf 8和排序规则utf8 polish ci my cnf 如下 init connect SET NAMES u
  • MySQL - 查找与连接表中的所有行匹配的行

    表 1 曲目 表 2 词汇表 表 3 N M 轨道有单词 trackwords 找到包含所有单词的所有曲目 目前查询如下 SELECT DISTINCT t id FROM track as t Left Join trackwords a
  • 第一次如何配置postgresql?

    我刚刚安装了 postgresql 并在安装过程中指定了密码 x 当我尝试做的时候createdb并指定我收到消息的任何密码 createdb 无法连接到数据库 postgres 致命 用户密码身份验证失败 同样适用于createuser
  • SELECT COUNT() 与 mysql_num_rows();

    我有一个大表 60 数百万条记录 我正在使用 PHP 脚本来浏览该表 PHP 脚本 带分页 加载速度非常快 因为 表引擎是InnoDB因此SELECT COUNT 非常慢并且mysql num rows 不是一个选项 所以我将总行数 我用来
  • Mysql使用触发器建表

    我尝试在 Mysql 触发器内创建表 但没有创建 如何使用触发器创建表 这里传递的表的名称是动态的 据我所知 在触发器内创建表是不可能的 看这里 http forums mysql com read php 99 121849 122609
  • 如何在 laravel 中查询 json 列?

    我用的是 Laravel 5 6 我有一块田地 字段的数据类型为json 字段 desc 字段 的值如下所示 code 1 club CHE country ENGLAND code 2 club BAY country GERMANY c

随机推荐

  • 如何使用 nav.popTo() (ionic 2)?

    我正在使用导航控制器 要返回 我可以使用 nav pop 但是如果我需要转到其他页面 不是最后一个页面 如何使用 nav popTo constructor nav NavController this nav nav this nav p
  • Numpy int 位长度

    我想找到以二进制表示无符号 numpy 整数 或整数数组中的每个元素 所需的位数 就像 python 的int bit length 确实如此 但 numpy 似乎没有等效的功能 例如 gt gt gt int 0b1000 bit len
  • 如何防止 Dockerfile 缓存 git clone

    我有一个 Dockerfile 试图将 Web 应用程序打包并部署到容器中 应用程序的代码在 Docker 镜像构建期间从 git 存储库获取 这是 Dockerfile 快照 RUN git clone depth 1 git repos
  • 在 openpyxl 中格式化图表数据标签

    我正在使用 Python 3 6 3 使用 openpyxl 2 4 9 编写一些 Excel 工作表 在图表数据上获取数据标签并不明显 但当我尝试格式化所述数据标签时 事情开始变得糟糕 我想要做的是改变他们的位置并改变他们的轮换 有人有什
  • PDO Mysql 语法错误 1064 [已关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我运行以下代码 conn new PDO pdo at
  • PyQt 中的 QKeyPress 事件

    我的软件有问题 在我的钢琴软件中 如果我一直按下键盘上的某个键 那么它就会发出该特定键的多个重复的相同音调 但实际上我需要一个单一的音调 直到释放该特定的键 我提供了检测 keyPress 事件并调用相应方法的代码的一部分 那么我应该对我的
  • 用于 HTTPS 抓取的 Jsoup Cookie

    我正在尝试使用此网站在欢迎页面上收集我的用户名来学习 Jsoup 和 Android 使用以下代码 Connection Response res Jsoup connect http www mikeportnoy com forum l
  • 如何将 Spinner 默认值设置为 null?

    我正在尝试加载一个没有选定值的微调器 一旦用户选择了一个值 它就会将他们带到另一个页面 事实证明这是一个问题 因为目前页面只是在用户做出选择之前立即加载 我的 spinner 类的设置方式与 Google 的相同 http develope
  • 使用 document.body.innerHTML.replace 有多安全?

    正在运行类似的东西 document body innerHTML document body innerHTML replace 旧值 新值 危险的 我担心某些浏览器可能会搞乱整个页面 而且由于这是 JS 代码 这些代码将被放置在我无法控
  • 如何获取当前 .exe 的哈希值?

    SOLVED 我复制了该文件并在该副本上运行了哈希器 我需要我的应用程序来查找 EXE 当前的 MD5 我可以获取任何文件的MD5 但是 无论我做什么 我都无法获得 FileStream 来读取打开的 EXE 我尝试使用 FileOptio
  • 修改 google.translate.TranslateElement 结果中的元素

    我正在尝试将非常方便的 Google Translate 翻译元素嵌入到网页中 这非常简单并且效果很好 但我需要更改在生成的 HTML 中显示的默认文本 在使用过许多 Google API 和 js 库后 我认为这不会有问题 因为它几乎肯定
  • 创建 HuggingFace 数据集来训练 BIO 标记器

    我有一个字典列表 sentences text I live in Madrid labels O O O B LOC text Peter lives in Spain labels B PER O O B LOC text He lik
  • 使用处理程序从服务更新活动

    我想改变 a 的状态ToggleButton in my Activity当事件发生在service 任何人都可以帮我实现这个使用Handler 我的意思是我应该在哪里编写代码来创建处理程序以及如何从服务触发它 我读过类似的帖子 但是它们对
  • 地点选择器自动关闭

    我正在 android 中制作一个简单的地点选择器程序 问题是当我单击按钮时 地点选择器打开并在 2 3 秒后自动关闭 请帮忙 MainActivity java package com example akshay myapplicati
  • Android 发布高分辨率图像内存不足

    各位开发人员大家好 我正忙着让 android 从应用程序上传图像 我也让它工作了 代码如下 但是 当我发送大图像 10 兆像素 时 我的应用程序因内存不足异常而崩溃 解决方案是使用压缩 但如果我想发送全尺寸图像怎么办 我想也许与流有关 但
  • UINavigationController:每次转换后显示具有不同方向的嵌入式视图控制器?

    这是 StackOverflow 上的一个常见问题 但其他解决方案均无效 许多也是几年前写的 以下是一些考虑的帖子 UINavigationController 内的 viewController 是否可以有不同的方向 UINavigati
  • 我可以在返回 void 的函数中使用 return 语句吗?

    我必须返回到递归的上一级 下面的语法对吗 void f some code here return 是的 您可以从 void 函数返回 有趣的是 您还可以从 void 函数返回 void 例如 void foo return void 正如
  • 如何使用 Keras 实现 CNN-LSTM

    我正在尝试实现一个 CNN LSTM 对代表帕金森病 健康控制者语音的梅尔频谱图像进行分类 我正在尝试使用 LSTM 模型实现预先存在的模型 DenseNet 169 但是遇到以下错误 ValueError Input 0 of layer
  • 如何区分活动娱乐是由屏幕旋转还是内存不足引起的

    根据http developer android com training basics activity lifecycle recreating html 有多种方法可以触发活动重新创建 屏幕旋转 内存不足的情况 我意识到屏幕旋转 an
  • MySQL:将大表拆分为分区或单独的表?

    我有一个包含 20 多个表的 MySQL 数据库 但其中一个非常大 因为它从不同的传感器收集测量数据 它的磁盘大小约为 145 GB 包含超过 10 亿条记录 所有这些数据也被复制到另一台 MySQL 服务器 我想将数据分成更小的 碎片 所