MySQL优化—工欲善其事,必先利其器(2)_MySQL
bitsCN.com
上一篇文章简单介绍了下EXPLAIN的用法,今天主要介绍以下几点内容:
慢查询日志
- 打开慢查询日志
- 保存慢查询日志到表中
- 慢查询日志分析
Percona Toolkit介绍
- 安装
- pt-query-digest
- pt-index-usage
- pt-query-advisor
SHOW PROFILE
performance_schema
慢查询日志
打开慢查询日志
慢查询日志,顾名思义就是记录执行比较慢查询的日志。
查看是否开启慢查询日志:
show variables like '%slow%';
打开慢查询日志。修改MySQL的配置文件my.cn一般是在/etc目录下面,加上下面三行配置后重启MySQL。
slow_query_log = ONslow-launch-time = 2slow-query-log-file = /usr/local/mysql/data/slow_query.log
slow_launch_time只能精确到秒,如果需要更精确可以使用一些第三方的工具比如后面介绍的pt-query-digest。
注意:我这里用的MySQL版本是5.6,不同版本的MySQL开启慢查询的配置是不同的,比如5.6之前的某些版本是ong_query_time, long_query_time和log-slow-queries。可以先在终端执行show variables like '%slow%';查看下当前版本具体配置是什么。
也可以在终端通过设置全局变量来打开慢查询日志:
set @@global.slow_query_log = ON;
保存慢查询日志到表中
MySQL支持将慢查询日志保存到mysql.slow_log这张表中。通过@@global.log_output可以设置默认为TABLE,FILE和TABLE只能同时使用一个。
set @@global.log_output='TABLE';
我们可以使用下面的语句来模拟慢查询:
select sleep(10);
慢查询日志分析
1、可以使用MySQL自带的mysqldumpslow工具。使用很简单,可以跟-help来查看具体的用法。
# -s:排序方式。c , t , l , r 表示记录次数、时间、查询时间的多少、返回的记录数排序;# ac , at , al , ar 表示相应的倒叙;# -t:返回前面多少条的数据;# -g:包含什么,大小写不敏感的;mysqldumpslow -s r -t 10 /slowquery.log #slow记录最多的10个语句mysqldumpslow -s t -t 10 -g "left join" /slowquery.log #按照时间排序前10中含有"left join"的
2、可以导到mysql.slow_query表中,然后通过sql语句进行分析。
3、使用第三方工具,下面会有介绍。
Percona Toolkit介绍
percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务。这些任务包括:
- 检查master和slave数据的一致性
- 有效地对记录进行归档
- 查找重复的索引
- 对服务器信息进行汇总
- 分析来自日志和tcpdump的查询
- 当系统出问题的时候收集重要的系统信息
安装
安装percona-toolkit非常简单,到官网下载.tar.gz包:
wget percona.com/get/percona-toolkit.tar.gztar -zxvf percona-toolkit-2.2.5.tar.gz
然后依次执行下面的命令:
perl Makefile.PLmakemake testmake install
默认的会被安装在/usr/local/bin目录下。执行man percona-toolkit可以查看安装了哪些工具。
运行工具可能会遇到下面的错误:
这是因为缺少相应包,.pm包实际上perl的包,运行下面的命令安装即可:
yum install -y perl-Time-HiRes
如果安装过程中出现” Error Downloading Packages”错误,尝试yum clean all后再安装。使用其Percona Toolkit中其他工具也可能会遇到类似的问题,按照提示安装相应的perl包就可以了。
Percona Toolkit整个工具箱提供了非常多实用的工具,具体的使用方法可以参看官方文档。
下面有选择的给大家介绍几个有用的工具。
pt-query-digest
pt-query-digest可以从普通MySQL日志,慢查询日志以及二进制日志中分析查询,甚至可以从SHOW PROCESSLIST和MySQL协议的tcpdump中进行分析,如果没有指定文件,它从标准输入流(STDIN)中读取数据。
最简单的用法如下:
pt-query-digest slow.logs
输出信息大致如下:
整个输出分为三大部分:
1、整体概要(Overall)
这个部分是一个大致的概要信息(类似loadrunner给出的概要信息),通过它可以对当前MySQL的查询性能做一个初步的评估,比如各个指标的最大值(max),平均值(min),95%分布值,中位数(median),标准偏差(stddev)。这些指标有查询的执行时间(Exec time),锁占用的时间(Lock time),MySQL执行器需要检查的行数(Rows examine),最后返回给客户端的行数(Rows sent),查询的大小。
2、查询的汇总信息(Profile)
这个部分对所有”重要”的查询(通常是比较慢的查询)做了个一览表:
每个查询都有一个Query ID,这个ID通过Hash计算出来的。pt-query-digest是根据这个所谓的Fingerprint来group by的。举例下面两个查询的Fingerprint是一样的都是select * from table1 where column1 = ?,工具箱中也有一个与之相关的工具pt-fingerprint。
select * from table1 where column1 = 2select * from table1 where column1 = 3
- Rank整个分析中该“语句”的排名,一般也就是性能最常的。
- Response time “语句”的响应时间以及整体占比情况。
- Calls 该“语句”的执行次数。
- R/Call 每次执行的平均响应时间。
- V/M 响应时间的差异平均对比率。
在尾部有一行输出,显示了其他2个占比较低而不值得单独显示的查询的统计数据。
3、详细信息
这个部分会列出Profile表中每个查询的详细信息:
包括Overall中有的信息、查询响应时间的分布情况以及该查询”入榜”的理由。
pt-query-digest还有很多复杂的操作,这里就不一一介绍了。比如:从PROCESSLIST中查询某个MySQL中最慢的查询:
pt-query-digest –processlist h=host1
从tcpdump中分析:
tcpdump -s 65535 -x -nn -q -tttt -i any -c 1000 port 3306 > mysql.tcp.txtpt-query-digest --type tcpdump mysql.tcp.txt
从一台机器上讲slow log保存到另外一台机器上待稍后详细分析:
pt-query-digest --review h=host2 --no-report slow.log
还可以跟一些过滤条件。详见官方文档:http://www.percona.com/doc/percona-toolkit/2.2/pt-query-digest.html
另外结合一些第三方工具还能生成相应的报表,可以参考这里:http://biancheng.dnbcw.info/mysql/433514.html
建议:当slow log很大的时候最好还是将日志文件移到其他机器上进行分析。
pt-index-usage
这个工具主要是用来分析查询的索引使用情况。
pt-index-usage slow_query.log --h localhost --password 123456
详细的用法 –help查看再对照官网就差不再赘述。
注意使用这个工具需要MySQL必须要有密码,另外运行时可能报找不到/var/lib/mysql/mysql.sock的错,简单的从/tmp/mysql.sock链接一个就行了。
重点要说明的是pt-index-usage只能分析慢查询日志,所以如果想全面分析所有查询的索引使用情况就得将slow_launch_time设置为0,因此请谨慎使用该工具,线上使用的话最好在凌晨进行分析,尤其分析大量日志的时候是很耗CPU的。
整体来说这个工具是不推荐使用的,要想实现类似的分析可以考虑一些其他第三方的工具,比如:mysqlidxchx, userstat和check-unused-keys。网上比较推荐的是userstat,一个Google贡献的patch。
Oracle是可以将执行计划保存到性能视图中的,这样分析起来可能更灵活,但是目前我还没找到MySQL中类似的做法。
pt-upgrade
这个工具用来检查在新版本中运行的SQL是否与老版本一样,返回相同的结果,最好的应用场景就是数据迁移的时候。
pt-upgrade h=host1 h=host2 slow.log
pt-query-advisor
静态查询分析工具。能够解析查询日志、分析查询模式,然后给出所有可能存在潜在问题的查询,并给出足够详细的建议。这个工具好像2.2的版本给去掉了,有可能是因为对性能影响比较大新版本直接去掉了。
总结:上面这些工具最好不要直接在线上使用,应该作为上线辅助或故障后离线分析的工具,也可以做性能测试的时候配合着使用。
SHOW PROFILE
SHOW PROFILE是Google高级架构师Jeremy Cole贡献给MySQL社区的,它可以用来MySQL执行语句时候所使用的资源。默认是关闭的,需要打开执行下面的语句:
set profiling = 1;#这个命令只在本会话内起作用。
执行简单的SHOW PROFILES可以看到打开profiling之后所有查询的执行时间。
执行SHOW PROFILE [TYPE] FOR QUERY Query_ID可以看到MySQL执行某个查询各个步骤的各项性能指标的详细信息:
如果没有指定FOR QUERY则显示最近一条查询的详细信息。TYPE是可选的,有以下几个选项:
- ALL 显示所有性能信息
- BLOCK IO 显示块IO操作的次数
- CONTEXT SWITCHES 显示上下文切换次数,不管是主动还是被动
- CPU 显示用户CPU时间、系统CPU时间
- IPC 显示发送和接收的消息数量
- MEMORY [暂未实现]
- PAGE FAULTS 显示页错误数量
- SOURCE 显示源码中的函数名称与位置
- SWAPS 显示SWAP的次数
MySQL在执行查询语句的时候会有很多步骤,这里就不一一赘述了,用到的时候网上搜下就行。需要特别说明的是Sending data这个步骤,给人感觉是MySQL把数据发送给客户端的耗时,其实不然,这个步骤包括了MySQL内部各个存储之间复制数据的过程,比如硬盘的寻道。
总结:前面的慢查询日志分析更像是对整个MySQL查询情况做一个全面的检查,而SHOW PROFILE则是对单个查询语句的剖析,通常当现网出现问题时应该结合二者。使用慢查询分析定位到具体的查询,使用SHOW PROFILE定位到具体的问题,是Sending data比较耗时还是System lock比较耗时...
performance_schema
这两个库保存了MySQL的一些性能和元数据相关的信息,其中performance_schema是MySQL5.5才新增的,上面提到的很多工具其实利用了这个库的信息。比如SHOW PROFILE ALL FOR QUERY 2:的信息还可以通过下面的查询获取:
SELECT * FROM information_schema.profiling WHERE query_id = 2 ORDER BY seq;
利用performance_schema还可以做一些更灵活的统计:
SET @query_id = 1;SELECT STATE,SUM(DURATION) AS Total_R, ROUND(100*SUM(DURATION)/(SELECT SUM(DURATION) FROM INFORMATION_SCHEMA.PROFILING WHERE QUERY_ID = @query_id),2) AS Pct_R, COUNT(*) AS Calls, SUM(DURATION)/COUNT(*) AS "R/Call"FROM INFORMATION_SCHEMA.PROFILINGWHERE QUERY_ID = @query_idGROUP BY STATEORDER BY Total_R DESC;
这个简单的查询可以在《高性能MySQL第三版》中找到,可它能统计SHOW PROFILE各个步骤的耗时、耗时占比、调用API次数以及每次的平均耗时。在《高性能MySQL第三版》中还提到了很多有用的工具包括使用方法,强烈推荐这本书。
Ok,今天的介绍就到这里,这两篇文章的主要目的是希望自己在发现问题的时候可以知道从何下手,也希望能够大家带来一些实用价值。下一篇准备介绍一下MySQL执行语句的一些基本原理,俗话说磨刀不误砍柴工嘛!
bitsCN.com

핫 AI 도구

Undresser.AI Undress
사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover
사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

AI Hentai Generator
AI Hentai를 무료로 생성하십시오.

인기 기사

뜨거운 도구

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전
중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

드림위버 CS6
시각적 웹 개발 도구

SublimeText3 Mac 버전
신 수준의 코드 편집 소프트웨어(SublimeText3)

뜨거운 주제











1. 오늘 Toutiao에 기사를 게시하여 어떻게 돈을 벌 수 있습니까? 오늘 Toutiao에 기사를 게시하여 더 많은 수입을 얻는 방법! 1. 기본 권익 활성화: 기사의 원본은 광고를 통해 수익을 얻을 수 있으며, 동영상은 가로 화면 모드에서 원본이어야 수익을 얻을 수 있습니다. 2. 팬 100명 권리 활성화: 팬 수가 100명 이상에 도달하면 마이크로 헤드라인, 오리지널 Q&A 작성, Q&A 수익을 얻을 수 있습니다. 3. 독창적인 작품을 고집하라: 독창적인 작품에는 기사, 마이크로 헤드라인, 질문 등이 포함되며, 300단어 이상이어야 합니다. 불법 표절 저작물을 원작으로 출판할 경우 크레딧 점수가 차감되며, 수익금도 차감되므로 주의하시기 바랍니다. 4. 수직성: 전문 분야에서 기사를 작성할 때 분야를 넘나들며 마음대로 기사를 작성할 수 없으며 적절한 추천을 받을 수 없으며, 작품의 전문성과 정확성을 확보할 수 없으며 팬을 유치하기가 어렵습니다. 그리고 독자들. 5. 활동: 높은 활동,

Ethereum의 확장에 대한 @VitalikButerin의 새 기사 생각을 어떻게 이해합니까? 어떤 사람들은 Vitalik의 Blob Inscription 주문이 터무니없다고 말합니다. 그렇다면 Blob 패킷은 어떻게 작동합니까? 칸쿤에서 업그레이드한 후 Blob 공간이 효율적으로 사용되지 않는 이유는 무엇입니까? 샤딩 준비를 위한 DAS 데이터 가용성 샘플링? 제 생각엔 칸쿤의 성능은 업그레이드 이후에 쓸만할 것 같은데, 비탈릭은 롤업의 발전을 고민하고 있습니다. 왜? 다음으로 내 이해에 대해 이야기하겠습니다. 이전에 여러 번 설명했듯이 Blob은 EVM 호출 데이터에서 분리되어 합의 계층에서 직접 호출할 수 있는 임시 데이터 패키지입니다. 직접적인 이점은 EVM이 Blob에 액세스할 필요가 없다는 것입니다. 트랜잭션을 실행할 때 실행 계층 계산이 낮아집니다.

1. 휴대폰을 열고 WeChat 소프트웨어를 클릭한 후 WeChat 홈페이지 설정으로 들어갑니다. 2. 위챗 우측 하단의 [내]를 찾아 열어 [내] 페이지로 들어갑니다. 3. 컬렉션을 클릭한 후 새 페이지를 엽니다.

이번 글에서는 HTML5에 글을 추가하는 방법에 대해 알아보겠습니다. HTML5의 새로운 분할 요소 중 하나는 태그입니다. 기사는 태그를 사용하여 HTML로 표시됩니다. 보다 구체적으로 말하면 요소 내에 포함된 콘텐츠는 사이트의 나머지 콘텐츠와 다릅니다(관련이 있을 수 있음에도 불구하고). HTML5에 기사를 추가하는 방법을 이해하기 위해 다음 예를 고려해 보겠습니다. 예 1 다음 예에서는 기사 요소에 인라인 스타일을 사용하고 있습니다. <!DOCTYPEhtml><html><body><articlestyle="width:300px;border:2pxsolidgray;padding:

Toutiao Search Express 소프트웨어는 사용자가 검색할 수 있는 풍부한 기사 콘텐츠를 제공할 뿐만 아니라 사용자가 자신을 표현하고 지식을 공유할 수 있는 플랫폼도 제공합니다. 많은 사용자들이 터우탸오 검색 익스프레스 에디션에 기사를 게시하면 돈을 벌 수 있는지 알고 싶어하므로 오늘은 이 사이트의 편집자가 터우티아오 검색 익스프레스 에디션에 기사를 게시하면 돈을 벌 수 있는지, 기사 게시 방법에 대해 자세히 소개하겠습니다. 도움이 필요한 모든 사람에게 도움이 되기를 바랍니다. Toutiao Search Express에 기사를 게시하면 이익이 있습니까? 답변: 예. 1. 먼저 Toutiao 검색 속도 버전 소프트웨어를 엽니다. 홈페이지에서 오른쪽 상단에 있는 [더하기 아이콘]을 클릭합니다. 2. 그런 다음 동영상을 업로드할 수 있는 기사 게시 페이지로 이동합니다. 사진과 링크를 입력하고 텍스트를 입력하세요. 모든 것이 설정되었습니다.

DedeCMS는 대다수의 웹 사이트 제작자에게 깊은 사랑을 받는 강력한 오픈 소스 웹 사이트 콘텐츠 관리 시스템입니다. 그러나 이용 중 기사 내용이 유실되는 경우가 있어 웹사이트 관리자에게 상당한 불편을 초래하는 경우가 있습니다. 이 기사에서는 DreamWeaver CMS에서 기사 내용 누락 문제를 해결하는 방법을 소개하고 특정 코드 예제를 제공하여 이 문제에 직면한 웹 사이트 관리자에게 도움이 되기를 바랍니다. 문제 현상 설명: DreamWeaver CMS를 사용하는 과정에서 기사의 내용이 손실되는 경우가 있습니다. 가능한

제목: PHP 프로그래밍 기술: 여러 기사에 대한 Like 기능 구현 웹 사이트 개발에서 Like 기능은 사용자 상호 작용을 높이고 사용자 경험을 향상시킬 수 있는 일반적이고 중요한 기능 중 하나입니다. 이 기사에서는 PHP를 사용하여 여러 기사에 대해 like 기능을 구현하는 방법에 대해 설명합니다. 우리는 PHP와 MySQL 데이터베이스를 사용하여 이 기능을 구현하고 독자가 구현 프로세스를 더 잘 이해할 수 있도록 구체적인 코드 예제를 제공합니다. 1단계: 데이터베이스 만들기 먼저 기사 정보와 좋아요 수를 저장할 데이터베이스를 만들어야 합니다. 우리는 창조한다

DedeCMS는 다양한 웹 사이트 구축에 널리 사용되는 강력한 오픈 소스 콘텐츠 관리 시스템입니다. 그러나 가끔 기사 내용이 이용 도중 사라져서 웹사이트 운영자에게 불편을 끼치는 경우가 있습니다. 이 문서에서는 DreamWeaver CMS에서 문서 콘텐츠가 사라지는 일반적인 이유와 빠른 해결 방법을 소개하고, 이 문제를 해결하는 데 도움이 되기를 바라는 구체적인 코드 예제도 제공합니다. 1. 기사 내용이 사라지는 가능한 이유: 데이터베이스 작업 오류: 기사 내용을 데이터베이스에 저장하는 테이블이
