一条SQL查询语句经过MySQL查询优化器处理后,会生成一个所谓的执行计划。这个执行计划展示了查询的具体执行方式,比如多表连接的顺序是什么,每张表使用什么访问方式具体执行查询等等。本章的内容是帮助大家理解EXPLAIN语句的各个输出项是做什么用的,以便我们有针对性地提高查询语句的性能。学习步骤定位慢查询。使用解释分析。定位慢查询SQL在平时的工作中,想必你一定遇到过一条sql发出去,等了很久才出现返回值,不仅影响了测试速度,也大大降低了开发效率。所以我们学习sql慢查询定位是很有必要的。一般定位慢查询有两种方案:使用showprocesslist根据慢查询日志定位慢查询,查询正在执行的慢查询NO.1慢查询日志。超过参数long_query_time设置的值(单位秒,默认值10)且扫描记录数不小于min_examined_row_limit(默认值0)的语句。注意:默认情况下,慢查询日志中不会记录管理语句。如果需要记录,请做如下设置,设置log_slow_admin_statements=on,这样管理语句中的慢查询也会被记录到慢查询日志中。默认情况下,查询时间不超过long_query_time但不使用索引的语句将不会被记录。通过配置log_queries_not_using_indexes=on,所有不使用索引的SQL都会被记录在慢查询日志中(即使查询时间没有超过long_query_time的配置值)。使用慢查询日志的步骤:使用慢查询日志,一般分为四个步骤:打开慢查询日志。设置慢查询阈值。确定慢查询日志路径。确定慢查询日志的文件名。启用慢查询日志(默认关闭):mysql>setglobalslow_query_log=on;QueryOK,0rowsaffected(0.00sec)设置慢查询时间限制(只要查询时间大于这个值,就会记录在慢查询中查询日志,单位:秒):mysql>setgloballong_query_time=1;QueryOK,0rowsaffected(0.00sec)确定慢查询日志路径:mysql>showglobalvariableslike"datadir";确定慢查询日志文件名:mysql>showglobalvariableslike"slow_query_log_file";NOTE:Slowquery查询时间设置提示:对于线上业务,一般建议设置long_query_time为1秒。如果某项业务的MySQL对QPS要求比较高,可以将慢查询设置为0.1秒。当发现慢查询时,及时优化或者提醒开发重写。一般建议测试环境下long_query_time的阈值设置的比生产环境小一些。例如生产环境为1秒,测试环境建议配置为0.5秒。方便及时发现测试环境中一些低效的SQL。甚至一些重要的业务测试环境也可以将long_query_time设置为0,这样所有的语句都被记录下来。并注意慢查询日志的输出。上线前功能测试后,分析慢查询日志中每类语句的输出,重点关注Rows_examined(语句执行时从存储引擎读取的行数),提前优化。接下来,确认慢查询日志后,可以使用命令:tail-n5/data/mysql/mysql-slow.log详细查看上面的执行结果:tail-n5:只查看慢查询的最后5行queryfileTime:慢查询发生的时间User@Host:客户端用户和IPQuery_time:查询时间Lock_time:等待表锁的时间Rows_sent:语句返回的行数Rows_examined:扫描的行数statementexecutionduringstatementengine上面的方法是使用系统自带的慢查询日志查看的。如果觉得系统自带的慢查询日志不方便查看,可以使用pt-query-digest或者mysqldumpslow等工具对慢查询日志进行分析。这不是本节的重点。没有更多的演示。使用showprocesslist定位慢速查询。有时正在执行慢查询,这已经对数据库造成高负载。由于慢查询还没有执行,所以在慢查询日志中看不到任何语句。这时候可以使用showprocesslist命令来确定正在执行的慢查询。showprocesslist显示哪些线程正在运行。如果您具有PROCESS权限,则可以查看所有线程。否则,只会看到当前会话的线程。知识扩展:如果不使用FULL关键字,info字段中只会显示每条语句的前100个字符。如果想看到语句的全部内容,可以使用full修饰(showfullprocesslist)。下面对以上结果的关键参数进行解释:Time:表示执行时间Info:表示SQL语句我们可以通过它的执行时间(Time)来判断是否是慢SQL。EXLPAIN慢查询分析分析SQL执行效率是优化SQL的重要手段。通过上面提到的两种方式,定位慢查询语句后,我们就开始分析SQL的执行效率。做事必先利其器”,我们可以通过explain、showprofile、trace等诊断工具来分析慢查询。本节先讲解explain的使用,后面会分享showprofile和trace的使用方法下一节.explain可以获取到SQL语句在MySQL中的执行计划,比如语句是否使用了关联查询,是否使用了索引,扫描的行数等。它可以帮助我们选择更好的索引,写出更好的SQL。使用方法:在查询语句前加上explain即可运行。创建一个测试表并插入一些数据进行测试。在上图中,我们创建了3个索引PRIMARYKEY(`id`),聚集索引KEY`idx_a`(`a`),非聚集索引KEY`idx_b_c`(`b`,`c`)Non-clusteredindexdcolumnhasnoindexcreated分别执行三个SQL得到如下结果Explainfielddetailedexplanation(重点加粗项):这些列的重点解释:1.select_type的重点解释2.type的重点解释:Queryperformancefromtoptobottomisthebesttotheworst3.重点解读小结今天分享了定位慢SQL和用explain分析慢SQL的方法。这是这件事的结束。本节知识点总结如下:学习了两种慢查询定位方法。掌握explainkeycolumns的含义和用法,这也是工作中最常用的方法。在工作和面试中,SQL性能优化是我们经常遇到的问题。要想做好性能优化,就要学会使用SQL优化所需要的工具进行定位和分析。限于篇幅,本节只介绍explain工具的使用。在下一节中,将添加另外两个用于分析慢速查询的工具:showprofile和trace。后面会讲解SQL优化的一些知识点。相信小伙伴们对SQL性能优化会越来越熟练。
