0

0

mysql在天气预报系统中的数据存储架构

P粉602998670

P粉602998670

发布时间:2026-01-16 08:48:10

|

645人浏览过

|

来源于php中文网

原创

应分三张表:weather_realtime存最新数据、weather_fact按时间分区存明细、city_dim存城市维度,避免单表臃肿导致查询慢、索引膨胀、锁表争用及JSON滥用问题。

mysql在天气预报系统中的数据存储架构

为什么不用单表存所有天气数据

直接把城市、温度、湿度、风速、预报时间全塞进一张 weather_data 表,短期看着省事,但很快会卡死。查询“过去7天北京平均温度”要扫全表;加索引又因高基数字段(如 forecast_time)导致索引膨胀;更麻烦的是,历史归档和实时写入互相锁表——INSERTSELECT ... GROUP BY 一并发,MySQL 5.7 默认的 REPEATABLE READ 隔离级别下很容易触发间隙锁争用。

  • 实时数据写入频率高(每分钟可能数百条),应与历史分析分离
  • 用户查“未来3小时逐小时预报”和“去年同月降水统计”是两类完全不同的访问模式
  • 气象局接口返回的原始 JSON 字段(如雷达图 URL、空气质量详情)不适合强 Schema 约束,硬拆成列反而难维护

核心三张表怎么划分职责

实际跑得稳的架构通常靠三张表分工:实时缓存、结构化事实、维度信息。不是为分而分,是为让每个 INSERTSELECT 都落在最轻的路径上。

  • weather_realtime:只存最新1次观测/预报,主键是 (city_id, data_type)data_type 区分 “current”, “hourly”, “daily”)。用 REPLACE INTOINSERT ... ON DUPLICATE KEY UPDATE 写入,避免重复逻辑
  • weather_fact:存带时间粒度的明细,比如每小时一条。必须有 dtDATETIME,精确到分钟)、city_idtemp_chumidity_pct 等原子字段。按 dt 分区(PARTITION BY RANGE COLUMNS(dt)),每月一个分区,删旧数据只需 ALTER TABLE ... DROP PARTITION
  • city_dim:城市维度表,含 city_idname_zhlatlngtimezone_offset。和事实表用 city_id 关联,避免在 weather_fact 里重复存城市名——否则改个名字要全表更新
CREATE TABLE `weather_fact` (
  `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
  `city_id` INT NOT NULL,
  `dt` DATETIME NOT NULL,
  `temp_c` TINYINT,
  `humidity_pct` TINYINT,
  `wind_kph` DECIMAL(4,1),
  PRIMARY KEY (`id`, `dt`),
  KEY `idx_city_dt` (`city_id`, `dt`)
) PARTITION BY RANGE COLUMNS(dt) (
  PARTITION p202401 VALUES LESS THAN ('2024-02-01'),
  PARTITION p202402 VALUES LESS THAN ('2024-03-01')
);

JSON 字段到底放不放?放哪?

MySQL 5.7+ 支持 JSON 类型,但别滥用。原始 API 返回的嵌套结构(比如 {"air_quality": {"pm25": 12, "o3": 45}})确实适合存进 weather_realtime.raw_payload,但前提是:你从不按 pm25WHERE 查询,也不需要它参与聚合。

住哪API酒店+租车源码包
住哪API酒店+租车源码包

数据本地化解决接口缓存数据无限增加,读取慢的问题,速度极大提升更注重SEO优化优化了系统的SEO,提升网站在搜索引擎的排名,增加网站爆光率搜索框本地化不用远程读取、IFRAME调用,更加容易应用及修改增加天气预报功能页面增加了天气预报功能,丰富内容增加点评和问答页面增加了点评和问答相关页面,增强网站粘性电子地图优化优化了电子地图的加载速度与地图功能酒店列表增加房型读取酒店列表页可以直接展示房型,增

下载
  • 如果业务要求“查 PM2.5 > 100 的城市列表”,就必须把 pm25 提到 weather_fact 作为独立列,并建索引
  • JSON_CONTAINS()->>"$.air_quality.pm25" 在大表上走不了索引,全表解析 JSON 开销极大
  • 备份时 JSON 字段体积膨胀快,mysqldump 默认不压缩,传输带宽容易打满

时间字段用 DATETIME 还是 TIMESTAMP?

一律用 DATETIME。别被“自动转换时区”诱惑选 TIMESTAMP —— 天气数据的时间戳本质是事件发生时刻的绝对值(比如“2024-06-15 14:30:00 UTC”),不是服务器本地时间。MySQL 的 TIMESTAMP 存储时会转成 UTC,读取时再转回系统时区,一旦 DBA 调了 time_zone 变量,历史数据就全乱了。

  • 所有写入前确保应用层已将时间统一转为 UTC,存进 DATETIME
  • 查询时用 CONVERT_TZ(dt, '+00:00', '+08:00') 转成用户本地时区,别依赖连接级 time_zone 设置
  • DATETIME 范围更大(1001–9999年),避免千年虫问题;TIMESTAMP 到 2038 年就溢出
真实压测中,分区 + DATETIME + 分离实时/历史这三点没做对,哪怕加了 SSD 和 64G 内存,SELECT AVG(temp_c) FROM weather_fact WHERE dt BETWEEN '2023-01-01' AND '2023-12-31' GROUP BY city_id 也会在千万级数据上跑出 12 秒以上。关键不在硬件,而在数据落盘那一刻的结构选择。

相关专题

更多
mysql修改数据表名
mysql修改数据表名

MySQL修改数据表:1、首先查看数据库中所有的表,代码为:‘SHOW TABLES;’;2、修改表名,代码为:‘ALTER TABLE 旧表名 RENAME [TO] 新表名;’。php中文网还提供MySQL的相关下载、相关课程等内容,供大家免费下载使用。

662

2023.06.20

MySQL创建存储过程
MySQL创建存储过程

存储程序可以分为存储过程和函数,MySQL中创建存储过程和函数使用的语句分别为CREATE PROCEDURE和CREATE FUNCTION。使用CALL语句调用存储过程智能用输出变量返回值。函数可以从语句外调用(通过引用函数名),也能返回标量值。存储过程也可以调用其他存储过程。php中文网还提供MySQL创建存储过程的相关下载、相关课程等内容,供大家免费下载使用。

246

2023.06.21

mongodb和mysql的区别
mongodb和mysql的区别

mongodb和mysql的区别:1、数据模型;2、查询语言;3、扩展性和性能;4、可靠性。本专题为大家提供mongodb和mysql的区别的相关的文章、下载、课程内容,供大家免费下载体验。

281

2023.07.18

mysql密码忘了怎么查看
mysql密码忘了怎么查看

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql密码忘了怎么办呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

514

2023.07.19

mysql创建数据库
mysql创建数据库

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS 应用软件之一。那么mysql怎么创建数据库呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

253

2023.07.25

mysql默认事务隔离级别
mysql默认事务隔离级别

MySQL是一种广泛使用的关系型数据库管理系统,它支持事务处理。事务是一组数据库操作,它们作为一个逻辑单元被一起执行。为了保证事务的一致性和隔离性,MySQL提供了不同的事务隔离级别。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

386

2023.08.08

sqlserver和mysql区别
sqlserver和mysql区别

SQL Server和MySQL是两种广泛使用的关系型数据库管理系统。它们具有相似的功能和用途,但在某些方面存在一些显著的区别。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

528

2023.08.11

mysql忘记密码
mysql忘记密码

MySQL是一种关系型数据库管理系统,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。那么忘记mysql密码我们该怎么解决呢?php中文网给大家带来了相关的教程以及其他关于mysql的文章,欢迎大家前来学习阅读。

599

2023.08.14

Golang gRPC 服务开发与Protobuf实战
Golang gRPC 服务开发与Protobuf实战

本专题系统讲解 Golang 在 gRPC 服务开发中的完整实践,涵盖 Protobuf 定义与代码生成、gRPC 服务端与客户端实现、流式 RPC(Unary/Server/Client/Bidirectional)、错误处理、拦截器、中间件以及与 HTTP/REST 的对接方案。通过实际案例,帮助学习者掌握 使用 Go 构建高性能、强类型、可扩展的 RPC 服务体系,适用于微服务与内部系统通信场景。

8

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
MySQL 教程
MySQL 教程

共48课时 | 1.8万人学习

MySQL 初学入门(mosh老师)
MySQL 初学入门(mosh老师)

共3课时 | 0.3万人学习

简单聊聊mysql8与网络通信
简单聊聊mysql8与网络通信

共1课时 | 793人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号