划重点!必备 SQL 查询优化技巧,提升网站访问速度

news/2024/5/19 8:33:04/文章来源:https://blog.csdn.net/tTU1EvLDeLFq5btqiK/article/details/79124741

来自:开源中国 协作翻译

链接:oschina.net/translate/sql-query-optimization

原文:https://deliciousbrains.com/sql-query-optimization/

译者:南宫冰郁, rever4433, soaring, 凉凉_, Tony, 无若


在这篇文章中,我将介绍如何识别导致性能出现问题的查询,如何找出它们的问题所在,以及快速修复这些问题和其他加快查询速度的方法。



你一定知道,一个快速访问的网站能让用户喜欢,可以帮助网站从Google 上提高排名,可以帮助网站增加转化率。如果你看过网站性能优化方面的文章,例如设置服务器的最佳实现、到干掉慢速代码以及 使用CDN 加载图片,就认为你的 WordPress 网站已经足够快了。但是事实果真如此吗?


使用动态数据库驱动的网站,例如WordPress,你的网站可能依然有一个问题亟待解决:数据库查询拖慢了网站访问速度。


在这篇文章中,我将介绍如何识别导致性能出现问题的查询,如何找出它们的问题所在,以及快速修复这些问题和其他加快查询速度的方法。我会把门户网站 deliciousbrains.com 出现的拖慢查询速度的情况作为实际的案例。


定位

处理慢SQL查询的第一步是找到慢查询。Ashley已经在之前的博客里面赞扬了调试插件Query Monitor,而且这个插件的数据库查询特性使其成为定位慢SQL查询的宝贵工具。


该插件会报告所有页面请求过程中的数据库请求,并且可以通过调用这些查询代码或者原件(插件,主题,WordPress核)过滤这些查询,高亮重复查询和慢查询。



要是不愿意在生产安环境装调试插件(性能开销原因),也可以打开MySQL Slow Query Log,这样在特定时间执行的所有查询都会被记录下来。这种方法配置和设置存放查询位置相对简单。


由于这是一个服务级别的调整,性能影响会小于使用调试插件,但当不用的时候也应该关闭。


理解

一旦你找到了一个你要花很大代价找到的查询,那么接下来就是尝试去理解它并找到是什么让查询变慢。最近,在我们开发我们网站的时候,我们找到了一个要执行8秒的查询。


我们使用WooCommerce和定制版的WooCommerce软件插件来运行我们的插件商店。此查询的目的是获取那些我们知道客户号的客户的所有订阅。


WooCommerce是一个稍微复杂的数据模型,即使订单以自定义的类型存储,用户的ID(商店为每一个用户创建的WordPress)也没有存储在post_author,而是作为后期数据的一部分。订阅软件插件给自义定表创建了一对链接。让我们深入了解查询的更多信息。


把 MySQL 当作朋友

MySQL有一个很方便的语句DESCRIBE,它可以输出表结构的信息,比如字段名,数据类型等等。所以,当你执行DESCRIBE wp_postmeta;你将会看到如下的结果:



你可能已经知道了这个语句。但是你知道DESCRIBE语句可以放在SELECT, INSERT, UPDATE, REPLACE 和 DELETE语句前边使用吗?更为人们所熟知的是他的同义词 EXPLAIN ,并将提供有关该语句如何执行的详细信息。


这是我们查询到的结果:



乍一看,这很难解释。幸运的是,人们通过SitePoint总结了一个理解语句的全面指南。


最重要的字段是type,它描述了一张表是怎么构成的。


如果你想看全部的内容,那就意味着MySQL要从内存读取整张表,增加I/O的速度并在CPU上加载。这种被称为“全表浏览”—稍后将对此进行详细介绍。


rows字段也是一个好的标识,标识着MySQL将要不得不做的事情,它显示了结果中查找了多少行。


Explain也给了我们很多可以优化的信息。例如,pm2表((wp_postmeta),告诉我们是Using filesort,因为我们使用了 ORDER BY语句对结果进行了排序。如果我们要对查询结果进行分组,这将会给执行增加开销。


可视化研究

对于这种类型的研究,MySQL Workbench是另外一个方便,免费的工具。将数据库用MySQL5.6及其以上的版本打开,EXPLAIN的结果可以用JSON格式输出,同时MySQL Workbench将JSON转换成可视化执行语句:



它自动将查询的问题用颜色着重表示提醒用户去注意。我们可以马上看到,连接wp_woocommerce_software_licences(别名l)的表有严重的问题。


解决

你应该避免(https://dev.mysql.com/doc/refman/5.7/en/table-scan-avoidance.html)这种全部表浏览的查询,因为他使用非索引字段order_id去连接wp_woocommerce_software_licences表和wp_posts表。这对于查询慢是常见的问题,而且也是比较容易解决的问题。


索引

order_id在表中是一个相当重要的标志性数据,如果想像这种方式查询,我们需要在列上建立一个索引,除此之外,MySQL将逐字扫描表的每一行,直到找到我们想要的行为止。让我们添加一个索引并看看它是怎么样工作的:



哇,干的漂亮!我们成功的添加了索引并将查询的时间缩短了5s.


了解你的查询语句

检查下查询语句——看看每一个join,每一个子查询。它们做了它们不该做的事了吗?这里能做什么优化吗?


这个例子中,我们把licenses 表和posts 表通过order_id 连接起来同时限制post type 为shop_order。这是为了通过保持数据的完整性来保证我们只使用正确的订单记录,但是事实上这在查询中是多余的。


我们知道这是一个关于安全的赌注,在posts 表中software license 行是通过order_id 来跟 WooCommerce order 相关联的,这在PHP 插件代码中是强制的。让我们移除join 来看看有什么提升没有:



提升并不算很大但现在查询时间低于3 秒了。


缓存所有数据

如果你的服务器默认情况下没有使用MySQL查询缓存,那么你应该开启缓存。


开启缓存意味着MySQL 会把所有的语句和语句执行的结果保存下来,如果随后有一条与缓存中完全相同的语句需要执行,那么MySQL 就会返回缓存的结果。缓存不会过时,因为MySQL 会在表数据更新后刷新缓存。


查询监视器发现在加载一个页面时我们的查询语句执行了四次,尽管有MySQL查询缓存很好,但是在一个请求中重复读取数据库的数据是应该完全避免的。


你的PHP 代码中的静态缓存很简单并且可以很高效的解决这个问题。基本上,首次请求时从数据库中获取查询结果,并将其存储在类的静态属性中,然后后续的查询语句调用将从静态属性中返回结果:



缓存有一个生命周期,具体地说是实例化对象有一个生命周期。如果你正在查看跨请求的查询结果,那么你需要实现一个持久对象缓存。然而不管怎样,你的代码应该负责设置缓存,并且当基础数据变更时让缓存失效。


换位思考

不仅仅是调整查询或添加索引,还有其他方法可以加快查询的执行速度。 我们查询的最慢的部分是从客户ID到产品ID再到加入表格所做的工作,我们必须为每个客户做到。


我们是不是可以在需要的时候抓取客户的数据?如果是那样,那我们就只需要加入一次。


您可以通过创建数据表来存储许可数据,以及所有许可用户标识和产品标识符来对数据进行非规范化(反规范化)处理,并针对特定客户进行查询。 


您需要使用INSERT / UPDATE / DELETE上的MySQL触发器来重建表格(不过这要取决于数据来更改的表格),这会显着提高查询数据的性能。


类似地,如果一些连接在MySQL中减慢了查询速度,那么将查询分解为两个或更多语句并在PHP中单独执行它们可能会更快,然后可以在代码中收集和过滤结果。 Laravel 通过预加载在 Eloquent 中就做了类似的事情。


如果您有大量数据和许多不同的自定义帖子类型,WordPress可能会在wp_posts表上减慢查询速度。 如果您发现查询的帖子类型较慢,那么可以考虑从自定义帖子类型的存储模型移动到自定义表格中 - 更多内容将在后面的文章中介绍。


结论

通过这些查询优化方法,我们设法将查询从8秒降低到2秒,并且将查询次数从4次减少到1次。需要说明的是,这些查询时间是在我们开发环境运行时记录的 ,生产环境速度会更快。

这对追踪查询缓慢及其修复等问题是一个有用的指南。 优化查询看起来可能像一个可怕的任务,但只要你尝试一下,并取得一些初步的胜利,你就会开始找到错误,并希望做出进一步改善。

如果你有任何优化查询的建议或你喜欢使用的工具? 可以在评论中留言,让我们知道。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_791519.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AcFun网站已无法打开:官微表达无奈

IT之家2月2日消息 目前著名的弹幕网站AcFun中的视频已经无法播放,同时经过多地网友测试,AcFun的网站也已经无法打开,官微也发表微博,似乎表达对于网站无法打开的无奈。经过IT之家的测试,目前AcFun网站已经无法打开&…

大型网站限流算法的实现和改造

最近写了一个限流的插件,所以避免不了的接触到了一些限流算法。本篇文章就来分析一下这几种常见的限流算法分析之前依我个人的理解来说限流的话应该灵活到可以针对每一个接口来做。比如说一个类里面有5个接口,那么我的限流插件就应该能针对每一个接口就行…

高级Java开发人员最常访问的几个网站

这是高级Java开发人员最常访问的几个网站。 这些网站提供新闻,一般问题或面试问题的答案,精彩的讲座等。质量是优秀网站的关键因素,这此网站都有较高的质量内容。下面逐一介绍:1. StackoverflowStackoverflow.com可能是编程世界中…

高级Java开发人员最常访问的几个网站

这是高级Java开发人员最常访问的几个网站。 这些网站提供新闻,一般问题或面试问题的答案,精彩的讲座等。质量是优秀网站的关键因素,这此网站都有较高的质量内容。下面逐一介绍:1. StackoverflowStackoverflow.com可能是编程世界中…

大型网站系统架构的演化

四、使用集群改善应用服务器性能应用服务器作为网站的入口,会承担大量的请求,我们往往通过应用服务器集群来分担请求数。应用服务器前面部署负载均衡服务器调度用户请求,根据分发策略将请求分发到多个应用服务器节点。常用的负载均衡技术硬件…

JavaWeb之ServletContext——统计用户访问网站次数

各位小伙伴大家好呀~今天我们来了解 ServletContext 对象ServletContext 对象1)什么是 ServletContext 对象ServletContext 代表是一个 web 应用的环境(上下文)对象,ServletContext对象内部封装是该 web 应用的信息,一个 web 应用…

一个大型网站的技术架构是怎样建成的

网站系统架构层次如下图所示:1.前端架构前端指用户请求到达网站应用服务器之前经历的环节,通常不包含网站业务逻辑,不处理动态内容。浏览器优化技术并不是优化浏览器,而是通过优化响应页面,加快浏览器页面的加载和显示…

大型网站技术架构(二):架构要素和高性能架构

作者 | Arno原文 | https://segmentfault.com/a/1190000007390358在《大型网站技术架构(一)》我们把整个架构演变过程大致说了一下,这次我们来说说从哪方面进行考虑设计。为了使网站的能够应对高并发访问,海量数据处理&#xff0c…

网站高并发大流量访问的处理及解决方案

来自:Hist_花透的博客https://blog.csdn.net/qishouzhang/article/details/471119451.硬件升级普通的P4服务器一般最多能支持每天10万独立IP,如果访问量比这个还要大, 那么必须首先配置一台更高性能的专用服务器才能解决问题 ,否则…

网站 HTTP 升级 HTTPS 完全配置手册

作者:葡萄城技术团队链接:https://my.oschina.net/powertoolsteam/blog/1862967今天,所有使用Google Chrome稳定版的用户迎来了v68正式版首个版本的发布,详细版本号为v68.0.3440.75,上一个正式版v67.0.3396.99发布于6月…

ubuntu怎么跳出系统自动进去_wordpress、Dedecms织梦等网站系统怎么做百度自动推送?...

主动向百度等搜索引擎可缩短爬虫发现网站链接时间,加快网站的收录速度。网站时效性内容建议使用链接提交工具,实时向搜索推送数据。那么wordpress、Dedecms织梦等网站系统怎么做百度自动推送呢?有开发能力的对于动开发的人来说,要…

利用 PHP 扩展 Taint 找出网站的潜在安全漏洞实践

一、背景笔者从接触计算机后就对网络安全一直比较感兴趣,在做PHP开发后对WEB安全一直比较关注,2016时无意中发现Taint这个扩展,体验之后发现确实好用;不过当时在查询相关资料时候发现关注此扩展的人数并不多;最近因为换…

网站mysql密码怎么修改_mysql怎么修改密码

第一种方式:最简单的方法就是借助第三方工具Navicat for MySQL或Navicat Premium来修改,方法如下:1、登录mysql到指定库,如:登录到student库。2、然后点击上方“用户”按钮。3、选择要更改的用户名,然后点击…

百度网站疑似宕机 众多网友反馈不能正常登陆

从11月9日上午11点10分开始,有不少网友开始网上抱怨,百度网站及其旗下App都打不开的消息,而从用户的反馈来看,范围还是挺大的。目前,不少网友在微博上反馈称,百度网站似乎出现了宕机,很多用户不…

8个程序员专用软件/网站,个个是神器,第一个最惊喜......

节省时间的方法有俩,一个是放弃做一些事,在做一些事的时候同步做另一些事。另一种就是改进做一些事的效率,更快地做一些事。寻找更加高效、好用的工具所花费的时间,和这些工具将为你节省的时间相比,九牛一毛。今天给大…

大型网站图片服务器架构的演进!

在主流的Web站点中,图片往往是不可或缺的页面元素,尤其在大型网站中,几乎都将面临“海量图片资源”的存储、访问等相关技术问题。在针对图片服务器的架构扩展中,也会历经很多曲折甚至是血泪教训,尤其是早期规划不足&am…

Kali 利用setoolkit制作钓鱼网站

实验环境:一台kali(为机 NAT模式) 一台物理机(靶机) 在kali的终端上打开setoolkit 选择第一个社会工程,选择社会工程之后接着有11个选项. 选择第二个网站向量,选择完之后有8个选项. 选择第三个凭证收割方…

使用nginx部署网站

前面的话如果服务器只需要放置一个网站程序,解析网站到服务器的网站,网站程序监听80端口就可以了。如果服务器有很多应用,借助nginx不仅可以实现端口的代理,还可以实现负载均衡。本文将详细介绍前端及nodeJS项目在服务器配置时需要…

程序员一般都浏览这些网站,不仅仅提升编程水平!

程序员作为一个经常和互联网打交道的人群,他们喜欢浏览那些网站呢?不爱敲代码的程序猿整理了以下网站供大家参考,排名不分先后:0. Googlehttps://google.com这个不用多说了吧。1.GitHub 开发者最最最重要的网站:https:…

广西网站服务器区域选择,广西地区云服务器选择

广西地区云服务器选择 内容精选换一换obsutil是适用于Windows、macOS和Linux操作系统的命令行工具,支持通过配置内网DNS服务器地址的方式,使在华为云上的Linux ECS通过内网直接访问OBS,下面将介绍其具体操作流程和操作步骤。登录华为云&#…