从 MySQL 理解 InfluxDB
InfluxDB 不是把 MySQL 表加上时间字段后的数据库。两者在数据身份、索引、更新、保留和查询方式上采用不同假设。
概念对照
| MySQL | InfluxDB 时序模型 | 差异 |
|---|---|---|
| Database | Database 或 Bucket,取决于版本 | Bucket 还包含 Retention 语义 |
| Table | Measurement / InfluxDB 3 Table | 通常按指标类别组织,不按设备拆表 |
| Column | Tag 或 Field | Tag 是维度,Field 是观测值 |
| Row | Point | Point 必须围绕 Timestamp 表达 |
| Primary Key | Series Identity + Timestamp 的时序身份 | 不使用常规 AUTO_INCREMENT 主键 |
| Secondary Index | Tag/Series Index 或新引擎列式过滤 | 不为任意 Field 照搬 B+ Tree 索引设计 |
| DELETE | 通常按时间范围或条件删除 | 高频随机删除不是核心路径 |
| UPDATE | 重写相同 Point 或重新写入 | 不适合频繁随机行修改 |
写入对照
MySQL:
sql
INSERT INTO cpu_metric(host, region, usage_user, collected_at)
VALUES ('server01', 'cn-east', 23.5, '2026-08-20 08:00:00');InfluxDB Line Protocol:
text
cpu,host=server01,region=cn-east usage_user=23.5 1787212800000000000MySQL 的字符串列不会自动成为索引;InfluxDB 传统模型中的 Tag 会参与 Series Identity。字段放错位置不仅影响查询,还会改变存储和基数。
InfluxDB 3 SQL 入门
sql
SELECT
date_bin(INTERVAL '1 hour', time) AS hour,
host,
avg(usage_user) AS avg_usage
FROM cpu
WHERE time >= now() - INTERVAL '7 days'
AND region = 'cn-east'
GROUP BY 1, host
ORDER BY 1, host;虽然语法接近 SQL,但要保留时序习惯:
WHERE优先包含明确时间范围。- 使用时间窗口函数而不是对原始点做无限范围分组。
- Tag/维度用于过滤和分组,Field 用于聚合。
- SQL JOIN 是否适合取决于 InfluxDB 3 产品与数据分布,不代表可以照搬 OLTP 模型。
迁移判断
| MySQL 中的数据 | 是否适合迁入 InfluxDB |
|---|---|
| 每秒产生的设备采样 | 适合 |
| 主机和应用性能指标 | 适合 |
| 订单、账户余额和库存 | 不适合作为唯一主存储 |
| 设备基础信息 | 通常仍放关系库,可按查询需要冗余部分维度 |
| 历史状态变化 | 适合时序化保存,但当前状态可能另存 |
| 大段应用日志 | 视检索需求而定,日志系统可能更合适 |
最常见的组合是 MySQL 保存业务事实和主数据,InfluxDB 保存随时间产生的观测值。两者通过业务 ID 或稳定维度关联,但不要求每次时序查询实时访问 MySQL。