我们经常接触MySQL,也经常会遇到一些MySQL的性能问题。借助慢查询日志,我们可以初步分析出SQL语句的性能问题,并对命令进行讲解。通过SHOWFULLPROCESSLIST查看问题。SHOWFULLPROCESSLIST相当于select*frominformation_schema.processlist可以列出正在运行的连接线程。processlist描述:idconnectionid,可以使用kill+connectionid关闭连接(kill9339)user显示当前用户host显示连接的客户端IP和端口db显示连接到进程的数据库command显示当前执行statusofcurrentconnection,sleep,query,connecttimedisplay当前状态的持续时间(秒)state显示当前连接的SQL语句的执行状态,复制到tmp表,排序结果,发送数据等信息显示SQL语句。如果发现比较耗时的语句,可以复制下来,用explain来分析。慢查询日志慢查询日志是MySQL用来记录响应时间超过设定阈值(long_query_time)的SQL语句。默认情况下,慢查询日志是没有开启的,需要手动配置。下面我们需要记住几个常用的属性:slow_query_log:是否开启慢查询(ON为开启,OFF为关闭)long_query_time:慢查询阈值,表示SQL语句执行时间超过该值,将被记录,默认为10sslow_query_log_file:慢查询日志存储的文件路径log_queries_not_using_indexes:不使用索引查询语句的记录(ON为打开,OFF为关闭)log_output:日志存储方式(FILE表示将日志写入文件,TABLE表示将日志写入数据库,默认值为FILE,如果存储在数据库中,我们可以使用select*frommysql.slow_log的方式进行查询,一般对性能要求比较高,建议保存thefile)我们可以通过显示变量来查询我们设置的设置like'%keyword%'Attributevalueslow我们有两种方法来设置我们的属性,一种是setglobalattribute=value(restartfails),另一种是con配置文件(重启生效)命令方式:setglobalslow_query_log=1;setgloballong_query_time=1;setglobalslow_query_log_file='mysql-slow.log'配置文件方式:slow_query_log='ON'slow_query_log_file=D:/Tools/mysql-8.0.16/slow.loglong_query_time=1log-queries-not-using-indexespt-qurey-digest分析慢查询语句percona-toolkit包含了很多实用强大的mysql工具包,而pt-qurey-digest只是用来分析慢查询日志的工具之一.需要去官网下载,使用方法也很简单:./pt-query-digestslow2.log>>slow2.txt得到一个分析结果:#Query9:0.00QPS,0.00xconcurrency,ID0xF914D8CC2938CE6CAA13F8E57DF04B2Fatbyte499246#Thisitemisincludedinthereportbecause.liatchitmes#Thisitemisincludedinthereportbecause.liatchitmesScores:V/M=0.22#Timerange:2019-07-08T03:56:12to2019-07-12T00:46:28#Attributepcttotalminmaxavg95%stddevmedian#===================================================================#Count869#Exectime1147s1s3s2s3s685ms2s#Locktime0140ms2ms22ms2ms3ms2ms2ms#Rowssent00000000#Rowsexamine023.96M225.33k482.77k355.65k462.39k81.66k345.04k#Querysize217.72k2632632632630263#String:#Databasesxxxx#Hostsxx.xxx.xxx.xxx#用户根#Query_timedistribution#1us#10us#100us#1ms#10ms#100ms#1s#################################################################10s+#Tables#SHOWTABLESTATUSFROM`xxxx`LIKE'xxxxx_track_exec_channel'\G#SHOWCREATETABLE`xxxx`.`xxxxxxxx_exec_channel`\G#SHOWTABLESTATUSFROM`xxx`LIKE'xxxxx_TRACK_ASSIGN'\G#SHOWCREATETABLE`xxxx`.`xxxxx_EFFECTIVE_TRACK_ASSIGN`\G#SHOWTABLESTATUSFROM`xxx`LIKE'xxxx_task_exec'\G#SHOWCREATETABLE`xxxx`.`xxxxx_task_exec`\GUPDATExxxxxx_effective_track_exec_channelaSETEXEC_CHANNEL_CODE=(SELECTGROUP_CONCAT(DISTINCT(channel_id))FROMxxxxxx_EFFECTIVE_TRACK_ASSIGNWHEREstatusin(1,2,4)ANDidIN(SELECTassgin_idFROMxxxxxx_task_execWHEREtask_id=a.task_id))\Gexplain分析以上关于SQL语句的几点,大致介绍了几种获取慢查询SQL语句的方法。现在,我们需要使用explain来分析SQL语句查询慢的原因explain的使用也很简单。可以直接在SELECT|UPDATE语句前加上EXPLAIN来解释id表的执行顺序。复制的SQL语句往往被分成很多步。序号越大,越早执行。同一个id的执行顺序是从上到下。select_type数据读取操作的操作类型:SIMPLE(简单SELECT,不使用UNION或子查询等)PRIMARY(子查询中的最外层查询,如果查询包含任何复杂的子部分,则最外层的select被标记为PRIMARY)UNION(UNION中的第二个或后续SELECT语句)DEPENDENTUNION(UNION中的第二个或后续SELECT语句,取决于外部查询)UNIONRESULT(UNION的结果,union语句中的第二个Select启动所有后续选择)SUBQUERY(子查询中第一个SELECT,结果不依赖于外部查询)DEPENDENTSUBQUERY(子查询中第一个SELECT,依赖于外部查询)DERIVED(派生表的SELECT,FROM子语句的子查询)UNCACHEABLESUBQUERY(子查询的结果不能缓存,外链的第一行必须重新求值)表数据来自那个表,会使用一个临时的虚拟表类型来重试关联系统等复杂查询时的ve数据:表中只有一行记录。const:通过索引查找,一次性找到实际使用的索引key_len是索引的长度。一般来说,长度越短越好。ref列和索引的比较表示上表的连接匹配条件,即使用哪些列或常量来查找索引列上的值。rowsestimatelookup结果记录的数量。ExtraSQL查询的详细信息。Usingwhere:表示使用where条件进行过滤Usingtemporary:使用临时表临时存储结果Usingfilesort:表示mysql使用外部索引对数据进行排序。读取不是按表中的索引顺序执行的。usingindex:表示select语句中使用了覆盖索引,直接从索引中获取值。使用连接缓冲区:使用连接缓存。Usingindexcondition:表示查询列有非索引列
