我应该在MySQL中使用什么数据类型来存储每日项目和绘制1年图表?

iqxoj9l9  于 2022-11-21  发布在  Mysql
关注(0)|答案(1)|浏览(127)

我正在开发一个Web应用程序,希望绘制一个包含每日数据点的1年图表。
X轴是时间(日期),Y轴是数值类型。

  • MySQL版本:8.0(或更高版本)
  • DDBB必须存储多个客户的数据点。
  • 对于每个客户,我希望显示最后365个数据点(1年数据)。
  • 每个数据点都是一个元组:(date,int)。例如:(2022年11月10日第35期)
  • 该图表一次显示一个客户的数据。
  • 每天都会计算一个新的数据点并将其添加到客户数据集中。
  • 每个客户必须包含最多5年的数据点
  • 客户数量为1000。

假设customerCustomers表的外键(FK),我考虑了 dataset 的两个选项。

选项A

| 主索引键|客户(FK)|日期|数值|
| - -|- -|- -|- -|
| 一个|客户1|日期1|值1|
| 2个|客户1|日期2|数值2|
| 一个人。|一个人。|一个人。|一个人。|
| 不|客户1|日期N|值N|
| 第N+1次|客户2|日期1|数值N +1|
| 一个人。|一个人。|一个人。|一个人。|
| 2N|客户2|日期N| Val 2N值|

选项B

对数据集使用JSON类型
| 主索引键|客户(FK)|数据集|
| - -|- -|- -|
| 一个|客户1|数据集1|
| 2个|客户2|数据集2|
其中每个数据集如下所示:
((2022年1月1日,第35期)、(2022年1月2日,第17期)、......、(2022年12月31日,第42期))

备注:

我的兴趣是尽可能快地绘制图表,由于数据插入/更新操作每天只发生一次(针对每个客户),因此我的问题是:
哪个选项更适合数据检索?
现在我有大约50个客户和2年的数据历史,但我不知道当我增加客户数量和年数时DDBB的表现如何。
此外,我在前端使用JavaScript绘图库,所以我想知道JSON数据类型方法是否更适合这个目的。

csbfibhn

csbfibhn1#

CREATE TABLE datapoints (
    c_id  SMALLINT UNSIGNED NOT NULL,
    date  DATE NOT NULL,
    datapoint  SMALLINT/MEDIUMINT/INT [UNSIGNED] /FLOAT NOT NULL,
    PRIMARY KEY(c_id, date),
) ENGINE=InnoDB;

选择适合您的值的最小数据类型。例如,SMALLINT UNSIGNED只接受2个字节,允许最大为64 K的非负值。FLOAT为4个字节,范围很大,有效位数(大约7位)远远多于您可以合理绘制的数字。
主查询.首先用各种方法做日常INSERT:

INSERT INTO datapoints (c_id, date, datapoint)
    VALUES(?,?,?);
or
INSERT INTO datapoints (c_id, date, datapoint)
    VALUES
        (?,?,?),
        (?,?,?), ...
        (?,?,?);   -- 1000 rows batched
or
LOAD DATA ...

正在获取图形:

SELECT date, datapoint
    FROM datapoints
    WHERE c_id = ...
      AND date >= CURDATE() - INTERVAL 1 YEAR   -- or whatever
    ORDER BY date;

180万行(可能不到1GB)并不是很大。不过,我还是建议PRIMARY KEY按照这个顺序,不要包含AUTO_INCREMENT。INSERT(s)将每天一次插入表中的1000个位置。SELECT(用于图形化)将发现所有聚集在一起的数据--非常快。
如果您要保留过去一年的数据,我们可以进一步讨论。同时,要在5年后清除,这将是缓慢的,但每天只有一次:

DELETE FROM datapoints
    WHERE date < CURDATE() - INTERVAL 5 YEAR;

相关问题