IT互联网小助手|收藏|SQL查询优化技巧,提升网站访问速度!( 二 )
如果你想看全部的内容 , 那就意味着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 代码中的静态缓存很简单并且可以很高效的解决这个问题 。 基本上 , 首次请求时从数据库中获取查询结果 , 并将其存储在类的静态属性中 , 然后后续的查询语句调用将从静态属性中返回结果:
本文插图
推荐阅读
- 行业互联网,科创板|中一签大赚10万?本周打新千万别错过这一家
- 行业互联网|1.5亿元重奖50位青年科学家!可做科研也可还房贷
- 行业互联网|理光发布全新RICOH M C2000,打造恰到好处的新精彩
- 行业互联网|深圳第22届高交会闭幕:一大批新技术新成果集中亮相
- |互联网反垄断能成功吗?
- 行业互联网|2020十大新兴技术揭晓!每一项都可能颠覆我们的生活
- 智能穿戴,语音助手|HiFi级真无线蓝牙耳机,国民好物aigo T10测评
- 行业互联网|英国运输技术论坛发布网络安全标准和指南摘要
- 标杆学习|走进北京小米新总部参观考察-对标小米互联网思维与生态链创新
- IPv|专家:IPv6蕴藏机遇多,是支撑下一代互联网的基础