查找和修复缓慢的 WordPress 数据库查询的有用技巧
已发表: 2019-04-17适度的 SQL 查询会影响 WordPress 应用程序开发站点的执行。 偶尔,适度的查询是结构不充分的 SQL 的后遗症,本不应该这样做。
更重要的是,在某些情况下,适度的查询实际上在某个时间点是快速的问题——但是随着网站变得更加老练,查询变得越来越慢,无法保持对扩展数据库的了解。
尽管 SQL 如何变得温和,但应该研究几种方法来发现和解决 WordPress 应用程序开发中的问题。 有时可能需要某些 Web 应用程序,并且可能没有足够的精力、能力或支出计划来进行自定义改进。 在没有任何准备的情况下创建可以解决某些问题,但它可能比从当前代码库开始花费更长的时间。 WordPress 最初是作为博客平台构建的,并且在此方面一直表现出色。 尽管如此,它已经发展成为一个完全成熟的内容管理系统 (CMS),并且出于某些目的,它甚至可以创建一个强大的 Web 应用程序——速度快,而且支出计划比定制改进低得多。 虽然 WordPress 提供内置的开发应用程序,但它可以用于 Web 应用程序,以使其更加有用。 固有的页面和帖子结构可用于很多事情,但如果需要包含、查找或质疑、控制和显示自定义信息和字段,则需要一些额外的工作。
查找慢查询
寻找适度问题的来源包括两个阶段:
- 找出哪些问题是真正温和的问题。
- 识别正在运行它们的程序。
人们应该看看两个模块和一个 SaaS,它们可以让他们发现适度的查询。
查询监视器
要获取有关当前正在运行的页面的信息,可以使用此模块。 尽管有关于 WordPress 内部活动的一整套数据,但它还是逐点细分:
- 在这个需求上出现了多少问题?
- 页面上的哪个查询花费的时间最长?
- 哪些能力在 SQL 问题上投入的精力最多?
- 这些查询是来自模块、主题还是 WordPress 中心
查询屏幕甚至可以识别带有令人不安的红色内容的中等问题,这使得选择问题 SQL 变得非常简单。
调试栏
另一个用于查找温和适中的 SQL 的非凡工具是旧的、可信赖的调试栏模块。 当页面加载以下内容时,调试栏会提供有关 WordPress 内部功能的数据:
- WP_Query 的参数
- 请求数据(计数修改规则协调)
- 当前页面产生的SQL查询
要在调试栏中启用 SQL 跟踪,用户应该指出在站点上的某个位置允许 SAVEQUERIES — 可能在 wp-config.php 中
注意: SAVEQUERIES 会影响站点上的执行,并且可能不应该在生成服务器上使用。 但是,它可以在推进机器上使用。
使用 Debug Bar 查找适中的 SQL 并非易事。 例如,它没有为用户提供可排序的表或功能适度的查询。 Debug Bar 提供的是一种容量跟踪,可以将用户精确地引导到问题的起源方向。
这是加载的文档和执行查询的能力的概要。 通常情况下,一个人热衷于纲要中的绝对持续部分; 这是执行温和问题的地方,也是人们应该开始追捕的地方。 设置提示这个问题的每个容量的方便之处在于,它可以揭示在任何情况下执行 SQL 的原因。
新遗物
NewRelic 是一个衡量和筛选 Web 应用程序开发执行的管理机构,包括 WordPress 应用程序开发。 管理部门提供了大量有关该站点执行的数据。 NewRelic 为用户提供的 SQL 查询每一分钟的详细信息,很难让人完全失去方向感。
NewRelic 和我们之前引用的模块之间有两个值得注意的对比:
- NewRelic 提供了有关 PHP 执行的更多见解,包括每个函数所花费时间的精确计算
- NewRelic 会在看不见的地方跟踪对站点的每个需求,因此以后可以参考它来发现适度的 SQL。 这些模块只是给他当前页面。
重要的是,NewRelic 有一个免费的安排级别,可以提供有关网站执行的一般数据,但是,为了检查单一需求并找到适度的查询,人们必须升级到付费安排,以获取花哨的零碎物品。
用 EXPLAIN 理解慢查询
到目前为止,这些设备已被保护用于查找适度的问题。 目前应该知道为什么这些询问会阻碍事情。
MySQL EXPLAIN 口号可以使,呃,澄清发生了什么。 将 EXPLAIN 添加到查询的开头表明 MySQL 如何执行问题。 对于复杂的查询,EXPLAIN 可以帮助区分 SQL 中的中度焦点,例如,中度子查询或浪费活动。
修复慢查询
由于人们意识到查询是适度的,并且 EXPLAIN 已经向用户揭示了它的原因,因此应该考虑一些选择来解决这些令人昏昏欲睡的问题。
选项1:扭曲问题
可能有一个问题使编辑帖子的屏幕速度非常慢。 查询是自定义字段元框的一部分。
SQL 的明确部分是从 ks29so_postmeta 表中带来一个 meta_keys 列表,该列表很可能不以下划线符号开头。 GROUP BY 解释意味着每个结果都是特殊的。
多次运行此查询,以下是它可能需要的时间:
1.7145 秒
1.7911 秒
1.8076 秒
1.7707 秒
1.8456 秒
人们可能会开发一个查询,该查询会产生类似的输出。 它必须被选为一种 meta_keys 之一。 Exceptional 是特定的等价词,恰好是 SQL 解释!
选项 2:添加索引
当用户在一组 MySQL 表上运行 SQL 问题时,它需要检查整个表以了解哪些行对特定查询很重要。 当桌子变大时,检查开始需要相当长的时间。
这就是 MySQL 记录的用武之地。列表将信息放在一个表中并对其进行排列,从而使查找信息的难度大大降低。 通过以特定方式整理信息,文件有助于减少 MySQL 为每个查询完成的过滤措施。
文件可以添加到单个段或多个部分。
使用 meta_key 上的文件,第一个 SQL 问题时间有点像这样:
0.0041 秒
0.0023 秒
0.0030 秒
0.0025 秒
0.0019 秒
这是非常聪明的。
文件上的警告表达式:每次 INSERT 创建列或在 af 表上使用 UPDATE 时,都会重新确定列表,这可能是一项昂贵的活动。 记录使从表中阅读的速度更快,但写入它的速度更慢。 虽然正确放置的索引列表可以很好地工作,但如果不检查列表对数据库的一般影响,则不应沉迷于它。
选项 3:缓存查询结果
一旦意识到有一个温和的问题。 与其改变问题,不如解决问题的后果。 这样一来,人们就会限制查询的执行频率,而且他会更频繁地获得“免费通行证”。
WordPress Transients API 是保留查询的方法之一。 瞬态用于消除昂贵任务的后果,例如,
- 对外部网站的请求(例如获取持续的 Facebook 帖子)
- 缓慢的处理块(例如寻找具有习惯发音的巨大弦乐)
- 数据库查询慢!
选择一种方法
已经列出了许多替代方案,并且很可能有 17 种不同的方法来理解这种温和的调查。 应该采取哪种方法?
选择 1(改变问题)产生了出色的结果。 但是,应该考虑修改后的查询通常不会产生类似结果的可能性。 人们可能会不知不觉地用一个有点离题的问题来破坏代码。
备选方案 2(包括记录)并非总是可以想象,具体取决于查询使用的表格和部分。 由于 WordPress 应用程序开发中心表,人们不得不强调记录的其他影响:
- 中心刷新例程是否需要额外的列表?
- 请问包括一个文件中度下来不同的查询,类似于INSERT和UPDATE?
方案3(通过无家可归者的方式保留结果)效果微乎其微——用户无需更改第一个查询,也无需调整数据库结构。
通常,人们会选择选项 3。在特定情况下,他可能会根据他正在解决的问题或存在 SQL 问题的特定站点来选择另一种选择。 对于大多数执行问题,当然没有一种万能的反应,因此允许一个人与其他人的决定不同——或者,立即尝试这三个中的每一个!
保持更新
它在这里勾勒出了一个真正的问题。 CSS-Tricks 上的自定义字段框确实是一些极其温和的数据库查询的违规者。 它还勾勒出各种可能的安排方式。
构思全新的想法
人们可以采用不同的方法来尝试和加速问题的执行,其中包括比简单地调整查询或包含列表更多的工作。 问题中最慢的部分之一是连接表以从客户端 ID 到项目 ID 所做的工作,并且需要为每个客户端执行此操作。
可以通过制作一个存储许可信息的表格以及所有许可证的客户 ID 和项目 ID 来对信息进行非规范化,并简单地查询特定客户的信息。 需要使用在 INSERT/UPDATE/DELETE 上的 MySQL 触发器修改表到 licenses 表(或其他依赖于信息如何更改的表),但这将显着改善质疑该信息的执行。
因此,如果各种连接在 MySQL 中缓和了问题,将查询分解为至少两个关节并在 PHP 中独立执行它们,然后在代码中收集和引导结果可能会更快。