启用慢查询日志我们在项目中经常会遇到慢查询。当我们遇到慢查询的时候,我们通常会打开慢查询日志,分析慢查询日志,找到慢sql,然后使用explain来分析系统变量MySQL和慢查询相关的系统变量如下:执行如下语句查看慢查询日志是否开启,ON表示开启,OFF表示不开启showvariableslike"%slow_query_log%",可以看到我的没有开启,可以通过以下两种方式开启修改配置文件为slowquery修改配置文件my.ini,在[mysqld]段添加如下参数[mysqld]log_output='FILE,TABLE'slow_query_log='ON'long_query_time=0.001》需要重启MySQL才能生效,命令isservicemysqldrestart》设置全局变量我在命令行执行下面两句打开慢查询日志,设置超时时间为0.001s,记录日志到文件和mysql.slow_log表setglobalslow_query_log=on;设置全局日志_output='FILE,TABLE';setgloballong_query_time=0.001;“我想让配置文件里的配置永久生效,不然重启数据库后这些配置就失效了。”分析慢查询日志因为mysql慢查询日志相当于一个流水账,没有汇总统计的功能,所以我们需要使用一些工具来分析mysqldumpslowmysql内置了一个mysqldumpslow工具来帮助我们分析慢查询日志.常用用法#取出最常用的10个慢查询mysqldumpslow-sc-t10/var/run/mysqld/mysqld-slow.log#取出查询时间最慢的3个慢查询mysqldumpslow-st-t3/var/run/mysqld/mysqld-slow.log#获取包含leftjoin的按时间排序的前10条查询语句mysqldumpslow-st-t10-g"leftjoin"/database/mysql/slow-logpt-query-digestpt-query-digest是我的最常用的工具非常强大。可以分析binlog、generallog、slowlog,也可以分析showprocesslist或tcpdump抓取的MySQL协议数据。pt-query-digest是一个perl脚本,下载并授权执行下载并授权wgetwww.percona.com/get/pt-query-digestchmodu+xpt-query-digestln-s/opt/soft/pt-query-digest/usr/bin/pt-query-digest使用介绍//查看具体使用方法pt-query-digest--help//使用格式pt-query-digest[OPTIONS][FILES][DSN]》常用OPTIONS"--create-review-table当使用--review参数将分析结果输出到表时,如果没有表会自动创建。--create-history-table使用--history参数将分析结果输出到表时,如果没有表,会自动创建。--filter在分析前根据指定的字符串匹配过滤输入的慢查询--limit限制输出结果的百分比或数量,默认值为20,输出最慢的20条语句,如果是50%,按占总响应时间的比例从大到小排序,总计达到50%时结束输出。--hostmysql服务器地址--usermysql用户名--passwordmysql用户密码--history将分析结果保存在表中,分析结果更详细,下次使用--history,如果有相同的语句,则query所在的时间间隔与历史表的差异会记录在数据表中,通过查询同一个CHECKSUM可以比较某类查询的历史变化。--review将分析结果保存在表中。本次分析只是将查询条件参数化。一种类型查询一条记录比较简单。下次使用--review时,如果存在相同的语句分析,则不会记录到数据表中。--output分析结果输出类型,取值可以是report(标准分析报告)、slowlog(Mysqlslowlog)、json、json-anon,一般使用report方便阅读。--从什么时候开始分析,该值为字符串,可以是格式为“yyyy-mm-dd[hh:mm:ss]”的指定时间点,也可以是简单的时间值:s(秒),h(小时),m(分钟),d(天),如12h表示从12小时前开始统计。--untildeadline,配合--since可以分析一段时间内的慢查询。"CommonDSN"A指定字符集D指定连接的数据库P连接数据库端口S连接Socketfileh连接数据库主机名p连接数据库密码t使用时将数据存放在哪个表--review或--historyu连接数据库用户名DSN配置为key=value的形式;多个DSN用于分隔“使用示例”#showtheslowestqueryreportinslow.logpt-query-digestslow.log#analyzethequeryinlast12hourspt-query-digest--since=12hslow.log#分析指定范围内的查询pt-query-digestslow.log--since'2020-06-2000:00:00'--until'2020-06-2500:00:00'#将slow.log中的查询保存到query_history表pt-query-digest--user=root--password=root123--reviewh=localhost,D=test,t=query_history--create-review-tableslow.log#连接到localhost,读取processlist,输出toslowlogpt-query-digest--processlisth=localhost--user=root--password=root123--interval=0.01--outputslowlog#使用tcpdump获取MySQL协议数据,然后生成最慢查询报告#tcpdump使用说明:https://blog.csdn.net/chinaltx/article/details/87469933tcpdump-s65535-x-nn-q-tttt-iany-c1000port3306>mysql.tcp.txtpt-query-digest--typetcpdumpmysql.tcp.txt#分析binlogmysqlbinlogmysql-bin.000093>mysql-bin000093.sqlpt-query-digest--type=binlogmysql-bin000093.sql#analyzegenerallogpt-query-digest--type=genloglocalhost.log使用实践《编写存储过程批量创建数据》在实际工作中不测试性能。我们经常需要修改大量的数据,手动插入是不可能的。此时存储过程CREATETABLE`kf_user_info`(`id`int(11)NOTNULLCOMMENT'用户id',`gid`int(11)NOTNULLCOMMENT'客户服务组id',`name`varchar(25)NOTNULLCOMMENT'客户服务名称')ENGINE=InnoDBDEFAULTCHARSET=utf8COMMENT='客户信息表';如何定义存储过程?CREATEPROCEDURE存储过程名([参数列表])BEGIN要执行的语句END比如插入10万条id为1-100000的数据,用Navicat执行--删除之前定义的DROPPROCEDUREIFEXISTScreate_kf;--开始定义CREATEPROCEDUREcreate_kf(INloop_timesINT)BEGINDECLAREvarINT;SETvar=1;WHILEvar
