【问题标题】:How to improve speed for query of large text in mysql如何提高mysql中大文本的查询速度
【发布时间】: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


【解决方案1】:
CREATE INDEX `student_date`
ON date_uri_pair (`student_id`, `date`);
 WHERE student_id =30 AND date >= '2019-05-01' and date<= ''2019-05-30'

您有一系列条件,并且您有多个列索引。 尝试分离索引,一个用于日期,一个用于学生。

【讨论】:

  • 这是个坏建议。每个表只能使用一个索引;在 OP 的情况下,student_date 涵盖了被查询的两个列,并且是最佳方案(首先找到 30 岁的学生,然后在其中找到日期范围)。在您的情况下,将选择您的两个索引中更具歧视性的一个,并且需要逐行扫描找到的结果以查找另一列的标准。这意味着,采用您的建议将减少磁盘空间使用(通过减少索引大小),但会增加查询处理时间(与 OP 的查询相反)。
  • 如果他们的程序决定只使用日期怎么办?创建另一个索引是有意义的。创建另一个索引并没有什么坏处。 “使用”太多索引是粗略的部分。如果您无法理解我的建议,那么您的经验就有些欠缺。
  • OP 不在这里询问另一个查询。 OP 正在询问 this 查询。 this 查询的最佳索引是(student_id, date)。将student_date 分离为student 索引和date 索引增加了this 索引的查询时间。此外,如果有一个查询需要date 而不是student,它将被另一个索引date_sid 覆盖(但它也与所提出的问题无关)。
  • 现在,我需要通过学生ID和日期获取数据,所以我猜最佳索引是(student_id, date)
猜你喜欢
  • 2019-10-09
  • 1970-01-01
  • 2021-11-17
  • 2021-12-24
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2012-01-13
相关资源
最近更新 更多