使用SQL优化步入夏日尾声
2014年GSoC项目中,名为Joomla CMS SQL优化的项目已圆满结束,根据我的看法,这是一个成功的项目。这个项目不仅优化了查询,还分析了弱点,并找到了解决方案,以及进行了新的研究。经过四个月的艰苦工作,我提出了一些解决方案,这些解决方案可以被视为Joomla!数据库优化漫长旅程的第一步。这个项目的愿景是为Joomla!做出贡献,使其优于其他内容管理系统,我希望我的贡献将是漫长旅程的开始。
Joomla CMS SQL优化项目是什么
作为世界上最优秀的内容管理系统之一,Joomla在我们社区中与其他内容管理系统有着巨大的竞争。在大多数时候,我们认为关于CMS的是其增强和最新功能。但还有一个重要的事实,我们需要关注用户的角度。那就是系统的速度。这可以取决于许多因素。但最关键的事实/瓶颈是数据库管理系统和我们的存储和检索数据的方式。
我今年的GSoC项目主要关注上述事实。这个项目被称为Joomla CMS SQL优化,正如其名称所描述的,它专注于现有的SQL查询及其执行,以确定每个查询的可能优化方法。这个项目的愿景是为社区提供一个更快的方式与CMS互动,并减少基于数据库管理系统的开销。
优化重点领域
本项目基于以下优化重点领域:
- 分类相关查询优化
- 文章相关查询优化
- 标签、菜单、语言相关优化
- 嵌套集优化作为一个研究领域
上述研究领域是我最后关注的,其他三个领域首先完成。
执行优化工作
在项目工作中,我首先关注的是对Joomla核心中的查询执行过程以及SQL查询优化基本流程有一个正确的理解。为此,我一开始花费了大约2-3周的时间,然后基于对优化方法的调研开始了优化工作。
遵循的基本优化流程
在此项目中,采用了以下方法进行优化
- 引入子查询
- 引入索引
- 查询分解
- 移除不必要的计算
项目进度
在夏末,根据上述流程优化了许多查询。这些查询不仅包括用户端的查询,还包括管理员端的查询。在管理员端,优化的查询是基于获取类别、文章、菜单、标签。在管理员端,主要关注显示类别、文章、标签、菜单,添加新的类别、标签、菜单项、语言等。我在本地进行了测试,并在获得相当大的收益后,将它们推送到主仓库以供社区测试。本地进行的测试量可以通过社区验证。经过验证,如果我们将这些更改添加到主仓库,我可以保证收益是显著的。到目前为止,我已经将所有更改推送到主仓库,社区反馈是积极的,我非常高兴在这里提到这一点。
在项目开始时,我的一个里程碑是改进Joomla调试插件,但在中期评估后,我们决定除了调试插件增强外,还要开始研究嵌套集优化。这是因为嵌套集优化是优化重点之一。我已经完成了嵌套集优化的研究工作,这个领域还有剩余的工作要做。我已经采取了初步步骤,并在社区的帮助下,我们可以继续开始的工作。
嵌套集优化
在嵌套集优化工作中,我主要关注的是让组件创建者设计数据库表时无需包含路径、级别和parent_id字段。这是因为这些字段可以很容易地计算出来,而不是存储在数据库中并在每次更新时都进行更新,这非常耗费资源。我的方法是使用相关子查询来获取这些字段。为此,我在JTableNested类中创建了三个方法。当你从JTableNested扩展类时,可以访问这些方法。这些方法如下
通过计算获取节点的路径
getCorrelatedPathQuery($mapField)
通过计算获取节点的父ID
getCorrelatedParentIdQuery($lft,$rgt)
通过计算获取节点的级别
getCorrelatedLevelQuery($mapField)
参考:nested.php访问方法
我使用了getCorrelatedPathQuery ($mapField)通过计算为#__categories, #__tags, #__menu表获取路径。上述表的查询已被修改,即使它们没有路径字段也可以工作。你可以通过启用相关的Pull Request并从上述提到的表中删除路径字段来测试这些方法的工作方式。这是一个研究领域,需要更多的测试来识别每个可能情况下的漏洞。
如何访问我的项目工作
我所有的项目工作都存储在我的GitHub仓库中。我不会在报告中包含代码示例,因为在这里解释可能不会很清楚。每个查询的优化工作以及相关的测试结果都有详细的文档记录,并且附带的zip文件中包含了这些文档。尽管一些PR已经关闭,但它们已经被合并到其他PR中,可以在那里访问。此外,我已经列出了主仓库中PR的链接,并希望您能帮助测试并与我们分享结果。所有测试说明都已包含在那些PR中,也欢迎您提出建议。
我们需要您的帮助
老实说,我希望看到Joomla社区利用我的工作。为了使其成功,我们需要进行更多关于这项工作的测试。因此,我诚挚地邀请所有Joomla社区成员帮助通过测试所提供的工作来识别工作中的弱点以及可能的错误。
在这里,我附上了我针对每个优化pull请求创建的文档,其中包含了测试结果。其中一些pull请求已经合并在一起,以便发送到主仓库。但附带的文档详细描述了那些基本PR以及结果。
如果您愿意测试PR,我建议您阅读以下帖子来测试它们。下面列出的PR已发送到主仓库,我建议您遵循那里的测试说明。如果您想在我的仓库(GitHub)中测试每个单独的PR,请参阅附带的文档,这些文档还提供了我针对优化查询的测试结果。
未来工作
这个项目不是一个在夏天结束后就结束的项目。这是Joomla数据库优化的漫长旅程的第一步。除了优化后的SQL查询,我们还需要关注其他SQL查询。此外,嵌套集合的研究工作在初始步骤之后还有更多工作要做。因此,夏天之后我将继续从事这个项目,为Joomla社区提供有价值的支持,以保持其在世界上的领先地位。
致谢
在这个项目的成功背后,有两位柱石在我需要时给予我指导和帮助。他们是 Gunjan Patel 和 Nicola Galagano,他们支持我实现这个项目的预期成果。我衷心感谢他们在我整个项目中的帮助。我还想感谢 Mr. Ronni Christiansen(redCOMPONENET的总经理和远见者),在整个项目工作中为我们提供了用于项目测试的测试站点的托管。我还想特别感谢 Eli Aschkenasy,他在这个项目工作中关于优化技术和如何识别SQL查询瓶颈方面给予了我巨大的支持。我还非常感谢从项目开始就支持我的所有Joomla社区成员以及那些愿意测试我优化工作的每个人。
最后,我想再次感谢所有支持这个项目的人,因为你们所有人都给了我实现这个目标的支持。
在Joomla社区杂志上发表的一些文章代表了作者对特定主题的个人观点或经验,可能并不与Joomla项目的官方立场一致。
通过接受,您将访问由 https://magazine.joomla.net.cn/ 外部第三方提供的服务
评论