4.1 如何定位出项目中的慢SQL?
必答内容:
这个问题,在项目开发中,是非常常见的。在我们之前的项目中,用到了链路追踪组件 SkyWalking,通过SkyWalking我们就能够知道,所有请求的调用链路及执行耗时,,在显示的报表中,我们就可以看出哪一个接口比较慢,也可以看到这个接口执行过程中,每一个部分的具体耗时,包括SQL的执行具体时间也都可以看到,通过这个就可以定位慢SQL了.
那如果在一些项目中,没有用到这类的监控工具,也可以开启MSQL的慢查询日志,通过MySQL的慢查询日志来定位慢SQL。比如:我们可以在配置文件中配置一下,只要SQL语句的执行耗时超过1秒,我就需要将其记录在慢查询日志中,最终我们只需要通过这份慢查询日志,就能够知道哪些SQL的执行效率比较低
可能继续问道的问题:
而具体执行耗时多长时间才算慢,时间一般设置为多长呢?这个时间,其实没有一个定数,不同性质的项目之间也有差异,所以这个慢查询的界定时间,一般都要根据项目的情况来设置一个经验值,我们之前的项目中,设置的是1秒。
4.2 在项目中如何知道SQL语句的执行性能,以及索引是否生效?
必答内容:
这个我们可以借助于MySQL中提供的 explain 关键字,在查询的SQL语句之前,加上explain来查询SQL语句的执行计划。
当然explain查看到的执行计划信息比较多,我们主要关注几个核心指标就可以了。比如:通过 key、key_len 就能够知道是否命中素引。
通过 type 指标,就能知道该SQL的性能怎么样,有没有进一步优化的可能。一定要规避a全表扫描的情况。type指标性能由好到坏,依次是:NULL>system>const>eq_ref>ref>range>index>all还需要关注一个指标,就是extra额外的信息。 通过这一项,我们就能够知道,有没有回表查询,有没有涉及到fle sort排序。
然后,我们就可以针对 explain 查看到的执行计划,针对于SQL进行优化了。