选择横表还是纵表

数据库:MySQL 5.7
业务上有25个维度共2000多个指标数据需要存储。对于这种可变字段的指标数据,第一想法是采用纵表存储。但是具体该如何选择还是得结合业务看优缺点才行。

业务场景

数据量

1k台设备,每台设备每5分钟一次全量指标数据,存储60天

  • 纵表:602460/510002000=345.6亿
  • 横表:345.6亿/2000=1728万
查询场景
  • 按指标维度+时间范围分页查
  • 按同一时间上报的指标数据(时间+指标名称)

    方案

    纵表

    从数据量来看纵表数据量非常大,需考虑分表来解决查询效率问题。
    如果简单按查询数据量每表2kw来算(数据量不能简单按2kw算,需要计算字段长度,索引的页数大小),纵表需要分17280张表。按时间分页查询时,需要全表联合查询。

  • 按设备分
    数据量:1k张表,每张3456万
    7天分页查询:1k张表联合查询
    缺点:数据量大;数据分布不均匀;分页查询慢

  • 按维度分
    数据量:25张表,138240万=13.824亿
    缺点:数据量大

  • 按维度+时间分
    数据量:1500张表,2.304亿
    7天分页查询:7张表关联查询
    缺点:表数量太多;数据分布不均匀;

横表
  • 不分表
    缺点:字段列数多,MySQL是否支持呢?下面会列一下

  • 按维度分
    数据量:25张表,每张表约80个字段,70万条数据
    7天分页查询:不需要联表查询
    缺点:数据分布不均匀;表字段多;

  • 按维度+细分维度分
    细分指标只在计算时使用(同一时间上报的指标数据),分页查询时不使用
    数据量:40张表,每张表约50个字段,44万条数据
    7天分页查询:不需要联表查询
    缺点:数据分布不均匀;字段相对减少;

MySQL规范

每张表支持最大列数

Column Count Limits:1017

每行字节数

Row Size Limits:65,535 bytes

Table 14.25 InnoDB Maximum Tablespace Size