【发布时间】:2019-07-17 04:42:41
【问题描述】:
我有以下数据库架构。
CREATE TABLE `std_reslt` (
`student_id` int NOT NULL,
`date` date NOT NULL,
`info` LONGTEXT,
`result ` LONGTEXT,
`result_ids` LONGTEXT,
`sid` int NOT NULL
) ENGINE=InnoDB
PARTITION BY KEY(student_id)
PARTITIONS 50;
CREATE INDEX `student_date`
ON date_uri_pair (`student_id`, `date`);
CREATE INDEX `date_sid`
ON date_uri_pair (`date`, `sid`);
信息包含序列化的字符串值。序列化的数据是大量 JSON 字符串的集合。这太庞大了,我们需要将同一日期的数据分成多行。现在,当我们尝试使用以下查询查询数据库时,需要很长时间才能获得结果,尤其是当日期范围较大时。
SELECT info, result_ids FROM std_reslt WHERE student_id =30 AND date >= '2019-05-01' and date<= ''2019-05-30'
我需要获取数据,将包含数据的信息反序列化为:
[{"john":35, "john":75, "Haris":30, "Haris":40 .....}]
目标是通过将info的所有值相加来找到前N条记录,例如:
[{"john":110, "Haris":70}]
除了 LongText 之外还有其他数据类型吗,因为我认为 InnoDB 对 LongText 数据使用了不同的方法。如果我尝试反序列化数据并将每个数据存储在单独的列中,那么大小会非常大
【问题讨论】:
-
“如果我尝试反序列化数据并将每个数据存储在单独的列中,那么大小将非常大” - 您尝试过、计算过还是只是猜测? (另外,不相关,但你在
{"john":35, "john":75}不是没用的情况下用于 JSON 解析?)但是,+1 和 -
为什么将
result_ids存储在一行中?为什么不使用一对多关系表? -
因为result_ids的数据量很大。对于每个学生 ID 和每个日期,大约有 5000 条记录。所以对于 300 名学生和 30 天的数据,大约有 30*300*5000。结果和信息列也是如此。
标签: mysql amazon-rds