蜀天下100000 2023-07-25 17:21 采纳率: 75%
浏览 4
已结题

MYSQL数据存储使用问题

一个设备采信系统,连联一百多台数据,系统时时采设备状态数据,设备采集格式(ID号、类别、状态、时间)
要求1、采集数据要记录;2、网络上其它电脑上要时时显示所有设备状信息
我原来的做法是,时时查询所有设备最近的一次记录,每天数据量有几十万,久了就很慢,耗系统资源
请问一下,设备状态表与历史记录表要不要他开?怎么同步好,历史记录要不要做分区处理?

  • 写回答

3条回答 默认 最新

  • CSDN-Ada助手 CSDN-AI 官方账号 2023-07-25 20:35
    关注
    不知道你这个问题是否已经解决, 如果还没有解决的话:
    • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/7638061
    • 除此之外, 这篇博客: mysql中创建、查询、修改、删除数据表总结中的 因为本人之前一直写的是电子笔记,对自己学会的东西作一个总结,所以基本都是文字,本来想全发成博客的形式,发现全发成博客比较花费时间,而且一直发博客质量不是很好,而且通过发博客学到的东西也会变少,所以准备先把笔记发出来,后续再将它们改成博客的形式,争取2天至少改一篇博客,觉得我总结的还行的可以先关注我,后续会发成博客形式,内容也会更加完善 部分也许能够解决你的问题。
    • 以下回答由chatgpt基于相关博客总结生成:

      问题分析

      根据问题描述,目前的做法是实时查询所有设备最近一次的记录,但每天的数据量很大,导致查询变慢并且耗费系统资源。针对这个问题,可以考虑以下的优化方案:

      1. 数据存储优化:使用适当的索引和分区来提高查询性能。
      2. 查询优化:减少查询的数据量,使用合适的查询语句和算法来提高查询效率。
      3. 数据同步优化:通过定期同步或实时同步将设备状态数据发送至其他电脑,减少实时查询的数据量。

      接下来将对每个优化方案进行详细解答。

      数据存储优化

      1. 使用适当的索引

      索引是提高查询性能的常用手段,可以根据查询的需求创建合适的索引。根据问题描述,设备状态数据中包括ID号、类别、状态和时间,可以针对这些字段创建索引。比如,可以为ID号和类别字段创建唯一索引,为时间字段创建普通索引。

      -- 创建唯一索引
      CREATE UNIQUE INDEX idx_id ON device_status (ID号, 类别);
      
      -- 创建普通索引
      CREATE INDEX idx_time ON device_status (时间);
      

      2. 使用分区表

      根据设备状态数据的量级和查询需求,可以考虑将设备状态表和历史记录表分离,并为历史记录表进行分区处理。分区处理可以根据时间范围将数据划分为多个分区,提高查询效率。

      -- 创建设备状态表
      CREATE TABLE device_status (
          ID号 INT NOT NULL,
          类别 VARCHAR(20) NOT NULL,
          状态 VARCHAR(20) NOT NULL,
          时间 DATETIME NOT NULL,
          PRIMARY KEY (ID号, 类别)
      );
      
      -- 创建历史记录表并进行分区处理
      CREATE TABLE device_status_history (
          ID号 INT NOT NULL,
          类别 VARCHAR(20) NOT NULL,
          状态 VARCHAR(20) NOT NULL,
          时间 DATETIME NOT NULL,
          PRIMARY KEY (ID号, 类别, 时间)
      ) PARTITION BY RANGE (YEAR(时间)) (
          PARTITION p0 VALUES LESS THAN (2022),
          PARTITION p1 VALUES LESS THAN (2023),
          ...
      );
      

      查询优化

      1. 减少查询的数据量

      实时查询所有设备最近一次的记录可能需要遍历大量数据,可以通过限制查询的数据量来减少查询的开销。例如,只查询最近一天或最近一周内的数据。

      SELECT * FROM device_status
      WHERE 时间 >= DATE_SUB(NOW(), INTERVAL 1 DAY);
      

      2. 使用合适的查询语句和算法

      根据具体的查询需求,选择合适的查询语句和算法来提高查询效率。例如,针对ID号进行精确查询时可以使用=操作符,对时间字段进行范围查询时可以使用BETWEEN操作符。

      SELECT * FROM device_status
      WHERE ID号 = 123;
      
      SELECT * FROM device_status
      WHERE 时间 BETWEEN '2022-01-01' AND '2022-01-31';
      

      数据同步优化

      1. 定期同步数据

      定期将设备状态数据发送至其他电脑可以减少实时查询的数据量,只需同步最新的一段时间内的数据。可以根据实际需求确定同步的频率,比如每小时、每天或每周。

      2. 实时同步数据

      如果需要实时显示所有设备的状态信息,可以使用消息队列或实时数据库等技术实现数据的实时同步。设备状态数据更新时,立即将数据推送至其他电脑的应用程序,实现实时显示。

      结论

      针对优化MySQL数据存储和查询的问题,可以通过优化数据存储、查询和数据同步来提高系统的性能和响应速度。具体的优化方案包括使用适当的索引和分区来提高查询性能,减少查询的数据量,使用合适的查询语句和算法,以及通过定期同步或实时同步数据来减少实时查询的数据量。以上是一些常用的优化方法,实际应用中还需要结合具体场景和需求来选择和调整相应的优化方案。


    如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 8月11日
  • 已采纳回答 8月3日
  • 创建了问题 7月25日

悬赏问题

  • ¥15 对于这个问题的代码运行
  • ¥50 三种调度算法报错 有实例
  • ¥15 关于#python#的问题,请各位专家解答!
  • ¥200 询问:python实现大地主题正反算的程序设计,有偿
  • ¥15 smptlib使用465端口发送邮件失败
  • ¥200 总是报错,能帮助用python实现程序实现高斯正反算吗?有偿
  • ¥15 对于squad数据集的基于bert模型的微调
  • ¥15 为什么我运行这个网络会出现以下报错?CRNN神经网络
  • ¥20 steam下载游戏占用内存
  • ¥15 CST保存项目时失败