
你可能已经知道了这个语句。但是你知道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,每一个子查询。它们做了它们不该做的事了吗?这里能做什么优化吗?










