在线教育课程数据存储与查询优化实践研究

作者: 朱道恒 李晓玉 颜剑

在线教育课程数据存储与查询优化实践研究0

摘要:随着“互联网+教育”的快速发展和普及,在线学习用户数量激增,产生了海量的课程数据。高效的数据存储和查询机制对于保障系统流畅运行和提升学习者的体验至关重要。文章通过分析课程数据特征和常用数据库结构,提出了一种基于 Redis 的数据预读取策略,并设计了基于 MySQL 的冷热数据分离方案。实验结果表明,所提出的优化方案大幅提高了在线教育课程管理平台的数据存储和查询效率,可为在线教育课程的开发和数据库管理提供参考。

关键词:在线教育;课程数据;数据存储;数据预读取;冷热数据分离

中图分类号:TP311 文献标识码:A

文章编号:1009-3044(2024)31-0068-03

开放科学(资源服务)标识码(OSID) :

0 引言

“互联网+教育”模式[1]已成为教育行业的重要趋势。在线教育的普及使用户数量激增,产生了包括用户个人信息、学习行为记录、教学视频和课程资料等海量数据。高效的数据存储和查询机制对于保障在线系统的流畅运行和提升用户体验至关重要。我国在线教育市场不断扩大,对数据库存储和查询优化的需求日益增长[1]。国内学者在该领域的研究主要集中在以下几个方面:

1) NoSQL 数据库应用。采用MongoDB、Redis、HBase等NoSQL数据库处理在线教育产生的非结构化数据[2-5]。

2) 数据预读取策略。通过分析用户学习行为,提出基于学习模式的数据预读取策略,预测并提前加载用户可能需要的数据,提升查询效率[6]。

3) 冷热数据分离。根据数据访问频率的不同,将频繁访问的热数据和较少访问的冷数据分别存储,以提高系统的响应速度。

国外学者在数据库存储和查询方面的研究主要包括:

1) 分布式数据库系统。倾向于使用Cassandra和DynamoDB等分布式数据库系统来跨多个服务器分布数据,提高可用性和可扩展性[7]。

2) 缓存机制。为减少数据库访问延迟,许多教育平台采用了缓存机制,如使用Redis作为缓存层存储热点数据,加快数据存储和访问速度[8]。

3) 数据库压缩技术。研究数据库压缩技术以减少存储空间需求,提高读写效率[9]。

4) 实时大数据分析。许多研究者开始关注如何利用实时大数据分析来优化系统的个性化推荐[10]、学生体质测试[11]和教育资源分配[12]等功能。

本研究设计了一种在线教育数据的存储与查询优化方案,提出将MySQL中的大数据业务表进行冷热分离,并接入缓存数据库Redis,通过数据预读取和快速过期策略,加快有效数据流转。在自建的在线教育管理平台上验证了该方案的有效性和高效性。

1 数据存储选择

结合在线教育管理平台的业务特点,笔者对比了几种流行数据库的优缺点(见表 1) 。根据各数据库的特性,选择关系型开源数据库 MySQL 作为数据存储库,原因如下:

1) 支持多表联合查询。在线教育管理系统中涉及多张业务表,如教师、学生、课程、章节知识点、试卷、题目等。通常一次查询需要进行多表关联,因此优先选择支持多表联合查询的关系型数据库,如 MySQL、SQLServer 和 Oracle。

2) 开源特性。MySQL 数据库具有开源特性,利于后续的业务开发,使其更适应系统的业务特征,并保证平台的稳定运行。

3) 硬件要求低。MySQL 对硬件和业务要求低,能够加快系统的开发进度,提高开发效率。

2 数据查询优化设计

2.1 MySQL 配置优化

本研究从数据库引擎选择、索引建立规则和SQL 语句优化三个方面对 MySQL 进行了配置优化。

1) 数据库引擎选择。

MySQL 的主要引擎包含 ISAM、MYISAM、HEAP 和 InnoDB。在在线教育管理平台中,主要采用 In⁃ noDB 数据库引擎,因为它支持事务和外键,具有较高的可靠性和性能,能够最大限度地支持数据库的索引和事务操作,保障数据查询的基本功能。

2) 索引建立规则。

主键优化:由于 MySQL 数据库采用 B+ 树索引,每次数据插入或更新时,都需要更新索引树。为提高索引重建效率,系统将主键设置为整型,加快数据索引的建立过程。

索引字段选择:只对常用字段建立索引。除主键外,每个表最多只有一个字段建立索引,以提高数据查询效率,同时降低数据库对索引的存储空间需求。

外键设置:对所有表不设置外键,因为设置外键可能会影响某些 SQL 查询的性能,从而降低索引效率。

3) SQL语句优化。

避免全表扫描:尽可能使用索引来查询数据,避免因全表扫描导致的性能下降。

合理使用索引:查询语句应满足索引使用原则,如不判断 NULL 值,避免使用 OR 进行条件连接。

采用数字型字段:尽量使用数字型字段,因为数字比较比字符串比较效率更高。

避免使用 Select*:Select* 语句可能导致慢查询,拖慢数据库运行效率。

减少临时表操作:避免频繁创建和删除临时表,以减少系统资源消耗。

使用批量插入:采用批量插入方法,减少与数据库交互的次数,提高数据插入效率。

限制返回数据量:避免向客户端返回大量数据,减少网络传输负担。

通过这些方法,可以提升数据库的查询性能,降低后台对前端的响应时间,改善用户体验。

2.2 Redis 缓存数据预读取与快速过期方案

采用 Redis 数据库缓存用户请求的数据,可以有效降低 MySQL 数据库的压力[4]。当用户进行相关操作时,系统首先判断缓存中是否存在对应的数据:如果存在,则直接返回数据;如果不存在,则从 MySQL 数据库读取数据,返回给客户端,并将数据加载到缓存中。为加快系统读取数据的效率,设计了缓存数据预读取策略和快速过期方案。

1) 缓存数据预读取策略。

基于操作系统对数据分片读取的优势,考虑到“当用户访问某条数据时,他很可能会访问该数据附近的数据”。因此,在从缓存中读取数据时,实行预加载策略,确保用户在请求时,其所需的数据已在缓存中,直接命中缓存,减少对数据库的读取次数,提高查询性能。数据预加载流程如图1所示,步骤如下:

①用户请求数据:当用户需要访问课程1时,首先从缓存中读取。

② 缓存判断:若缓存中存在该数据,立即返回给客户端。

③数据加载:若缓存中不存在将数据,则请求MySQL。数据库返回数据给客户端,并将数据加载到缓存中。

④ 预加载相似数据:启用一个 Executor 线程任务,将与课程 1 相似的数据从磁盘加载到缓存中。

2) 缓存数据快速过期方案。

设计缓存快速过期策略,将缓存数据的过期时间设置为原数据的 1/10。这样,当用户不再访问该部分数据时,缓存能够快速剔除这些数据。若用户持续访问,则设定的缓存时间足够长,确保缓存中的垃圾数据最小化,提高缓存的有效性。

3 结构设计与测试

3.1 数据表结构设计

提出的冷热数据分离方案旨在提高系统的数据访问效率。通过将用户访问频繁的少量数据放在热表中,而较少访问的大量历史数据存放在冷表中,用户在访问数据时可以优先在热表中搜索。由于热表数据量少,这种方法能够极大地提高数据访问效率。

为平衡数据量增加或慢 SQL 执行导致的数据库性能下降,设计了一种方法,使得在数据量增加时,数据库查询效率仍保持稳定。具体做法是将数据量大的表按照数据的有效过期时间,分为历史表(his⁃ tory_table) 和当前表(current_table) ,实现数据查询的分离。这种方法有利于数据的快速统计和查询。实施方案如图 2 所示,分为3部分:

1) 数据查找。当其他模块调用并执行查找功能时,系统首先查找热数据表。由于热数据表的数据量一直维持在一定规模,查找过程速度较快。

2) 数据转移。采用线程池,将数据转移功能写入单个线程。执行时,通过 Executor 调用,将其作为任务放入线程池中。转移功能包括:传入需要变更操作时间的数据 ID,将数据复制到热数据表中,更新其操作时间,同时删除冷数据表中的对应数据。

3) 定时拷贝。采用 Scheduler 定时任务,在凌晨逐步扫描热数据表,检查数据表的数据量和所有数据的最近更新时间,确保数据的新鲜度。

3.2 单表压力测试

为模拟在线真实环境,对数据库表进行数据仿真和压力测试。测试方案基于在线教育管理平台中的选择题表 education_choicequestionbank 进行性能测试,其测试流程如图3所示。测试过程分为以下3步:

1)选定试测表。选择 education_choicequestion⁃bank作为测试表。

2) 执行测试语句。使用SELECT COUNT(*)语句进行测试。该语句在表查询过程中较为通用,能有效反映各种 SQL 语句的性能,同时测试效果明显。

3) 逐步增加数据量。将数据量从十万级增加到百万级,再调整到千万级,逐步进行测试,观察查询性能的变化。

4 实验结果

4.1 实验环境

表 2 展示了在线教育管理平台的部署环境信息,包括以下几个关键指标:硬件环境、软件环境、Web 服务器版本、数据库版本、网络环境、测试工具版本、测试线程数和运行时长等。这些信息为平台的性能测试和运行稳定性提供了重要参考依据。

4.2 冷热数据分离方案测试结果

实验环境部署成功后,选择题表 education_ choicequestionbank作为测试数据表,用于对冷热数据分离方案进行数据聚合测试。该测试旨在观察在大数据量条件下的表查询效率。核心参数的详细说明见表 3。

不同数据量级的测试结果如表4所示。

根据表 4,当表中数据量达到千万级时,选择题表的查询平均吞吐量约为0.31次/秒,相当于每 3 秒执行一次 SQL 查询。在 300 秒的测试中,约执行了 94 个样本语句。随着数据量的减少,查询性能显著提升:当数据量为百万级和十万级时,查询平均吞吐量分别为3.70 次/秒和45.30次/秒。

由此可见,随着表中数据量的上升,部分 SQL 查询性能受到显著影响。考虑到在线教育管理平台的业务范围,选择题表中产生的题目数量可按公式(1) 估算:

N = Ci × Si × d (1)

其中,Ci为课程类型的数量,Si为每种类型下的课程数量,i 为课程类型编号,d 为学习天数。如果有1 万人同时在线学习 1 天,产生的试题数量将至少达到百万级别。对于 SELECT COUNT(*) 这样的语句,每秒只能执行约 3.70 次查询。当数据量达到千万级时,数据表冷、热分离方案的优势得以体现。

4.3 查询时间

为了比较课程数据查询优化方案实施前后的查询效果,进行了不同数据量级的查询测试。具体测试内容包括查询不同数据量的学生考试成绩信息,并记录每种类型课程每次查询耗时。每种数据量进行10 次测试并计算平均耗时,结果如表5所示。

从表 5 可以看出,平均查询耗时随着数据量的增加而增加。然而,使用优化方案后,在不同数据规模下的耗时明显低于优化前。随着数据规模的扩大,优化前后的耗时比值也逐渐增大。因此,该方案能够加快数据查询速度,提升系统的查询效率。

5 结论

随着在线教育的普及,在线教育系统对课程数据存储和访问效率的需求日益提高。本文针对关系型数据库在大规模数据环境下查询效率低的问题,从以下3个方面提出优化方案进行实践研究:

1) 数据库选型。根据各数据库的优缺点,结合在线教育管理平台的业务特性,选择 MySQL 数据库作为平台的数据库。

2) 查询优化。通过调整 MySQL 的相关配置,使其适应平台业务需求,并提出基于 Redis 的数据预读取方案,以加快数据读取速度。

3) 冷热数据分离。针对 MySQL 数据库的大数据量,将频繁访问的数据存储于热表,较少访问的数据存储于冷表,从而提升用户数据获取效率。

实验结果验证了所设计方案能够有效提高系统查询的准确性和高效性,为在线教育课程开发和数据库管理提供了有益的参考。未来,将进一步优化课程结构及数据存储和查询机制,探索更多高效的数据库管理策略,以满足不断增长的在线教育数据需求。

【通联编辑:唐一东】

基金项目:广东海洋大学科研启动经费项目(060302112314,060302112317)

经典小说推荐

杂志订阅