在MySQL上进行开发时,我真的很想能够启动分析器。我发现SQLyog是Query Analyzer的足够好的替代品,但是没有找到像SQL Profiler一样工作的工具。
对于尚未看过Microsoft SQL Profiler的MySQL员工,以下是屏幕截图
在我上一份工作中,我们有一个工具胜过SQL Profiler,甚至给了我们堆栈跟踪信息。
有人知道我提到的与MySQL兼容的任何工具吗?
(仅供参考,我可以让Altiris Profiler与MySQL一起使用,但它还涉及运行Windows,但它实际上不是Symantec sku,因此许可确实很棘手)
#1 楼
MySQL从未提出过查询性能分析。既然MySQL已被Oracle推崇,我知道情况仍将如此。它提供了一些绝对出色的工具,可满足开发人员和DBA的所有需求,包括查询性能分析。它具有许多功能,例如:查询分析
复制心跳
复制从属管理
表校验和和同步
> Percona最近将MAATKIT分叉到一组最新的工具中,今天称为Percona Toolkit。这些工具通过扩展面向认真的MySQL用户的活动领域,使MAATKIT停止了工作,其中包括以下内容:
外键错误检查
在线模式更改> Visual Explain Plans
以及更多...
回到最初的问题,那里用于查询性能分析的工具是
pt-query-digest
mk-query-profiler(针对MAATKIT用户)
mk-query-digest(针对MAATKIT用户)
以下是使用以下工具之一可以提供的丰富信息的示例:
我帮助客户实施mk-query-digest报告了20个最差每20分钟执行一次查询。我从这个YouTube视频中得到了这个主意。客户端会将任何错误查询的输出移至memcached,从而降低查询对数据库造成的损失。
这是我制作的脚本,称为mk-query-digest(检查进程列表)仅)
#!/bin/sh
RUNFILE=/tmp/QueriesAreBeingDigested.txt
if [ -f ${RUNFILE} ] ; then exit ; fi
MKDQ=/usr/local/sbin/mk-query-digest
RUNTIME=
COPIES_TO_KEEP=
DBVIP=
WHICH=/usr/bin/which
DATE=`${WHICH} date`
ECHO=`${WHICH} echo`
HEAD=`${WHICH} head`
TAIL=`${WHICH} tail`
AWK=`${WHICH} awk`
SED=`${WHICH} sed`
CAT=`${WHICH} cat`
WC=`${WHICH} wc`
RM=`${WHICH} rm | ${TAIL} -1 | ${AWK} '{print }'`
LS=`${WHICH} ls | ${TAIL} -1 | ${AWK} '{print }'`
HAS_THE_DBVIP=`/sbin/ip addr show | grep "scope global secondary" | grep -c "${DBVIP}"`
if [ ${HAS_THE_DBVIP} -eq 1 ] ; then exit ; fi
DT=`${DATE} +"%Y%m%d_%H%M%S"`
UNIQUETAG=`${ECHO} ${SSH_CLIENT}_${SSH_CONNECTION}_${DT} | ${SED} 's/\./ /g' | ${SED} 's/ //g'`
cd /root/QueryDigest
OUTFILE=QP_${DT}.txt
HOSTADDR=${DBVIP}
${MKDQ} --processlist h=${HOSTADDR},u=queryprofiler,p=queryprofiler --run-time=${RUNTIME} > ${OUTFILE}
#
# Rotate out Old Copies
#
QPFILES=QPFiles.txt
QPFILES2ZAP=QPFiles2Zap.txt
${LS} QP_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9][0-9].txt > ${QPFILES}
LINECOUNT=`${WC} -l < ${QPFILES}`
if [ ${LINECOUNT} -gt ${COPIES_TO_KEEP} ]
then
(( DIFF = LINECOUNT - COPIES_TO_KEEP ))
${HEAD} -${DIFF} < ${QPFILES} > ${QPFILES2ZAP}
for QPFILETOZAP in `${CAT} ${QPFILES2ZAP}`
do
${RM} ${QPFILETOZAP}
done
fi
rm -f ${QPFILES2ZAP}
rm -f ${QPFILES}
rm -f ${RUNFILE}
我是使用mk-query-digest连接到mysql的用户
GRANT PROCESS ON *.* TO 'queryprofiler'@'%' IDENTIFIED BY 'queryprofiler';
这是我每20分钟(不到10秒)运行的crontab,保留最后的144份副本(这是48小时的分析)
不可思议的部分:mk-query-digest的输出
这里是一个运行于2011-12-28 11:20:00的配置文件,持续了1190秒(20分钟少了10秒)
最后22行
*/20 * * * * /root/QueryDigest/ExecQueryDigest.sh 1190s 144 10.1.1.8
请注意,这是根据查询响应时间除以查询次数得出的20个性能最差查询的列表
查看查询ID#1,即
0x5E994008E9543B29
,我们在输出文件中找到该查询ID,这是该特定查询的报告:# Rank Query ID Response time Calls R/Call Item
# ==== ================== ================ ======= ========== ====
# 1 0x5E994008E9543B29 40.3255 11.2% 101 0.399263 SELECT schedule_occurrence schedule_eventschedule schedule_event schedule_eventtype schedule_event schedule_eventtype schedule_occurrence.start
# 2 0x392F6DA628C7FEBD 33.9181 9.4% 17 1.995184 SELECT mt_entry mt_objecttag
# 3 0x6C6318E56E149036 26.4695 7.3% 102 0.259505 SELECT schedule_occurrence schedule_eventschedule schedule_event schedule_eventtype schedule_event schedule_eventtype schedule_occurrence.start
# 4 0x00F66961DAE6FFB2 25.5472 7.1% 55 0.464495 SELECT mt_entry mt_placement mt_category
# 5 0x99E13015BFF1E75E 22.3618 6.2% 199 0.112371 SELECT mt_entry mt_objecttag
# 6 0x84DD09F0FC444677 22.3516 6.2% 39 0.573118 SELECT mt_entry
# 7 0x440EBDBCEDB88725 21.1817 5.9% 36 0.588380 SELECT mt_entry
# 8 0x8D258C584B858811 17.2402 4.8% 37 0.465951 SELECT mt_entry mt_placement mt_category
# 9 0x4E2CB0F4CAFD1400 16.9768 4.7% 40 0.424419 SELECT mt_entry mt_placement mt_category
# 10 0x377E0D0898266FDD 16.6979 4.6% 150 0.111319 SELECT polls_pollquestion mt_category
# 11 0x3B9686D98BB8E054 16.2089 4.5% 32 0.506529 SELECT mt_entry mt_objecttag mt_tag
# 12 0x97F670B604A85608 15.6158 4.3% 34 0.459287 SELECT mt_entry mt_placement mt_category
# 13 0x3F5557DA231225EB 14.4309 4.0% 36 0.400859 SELECT mt_entry mt_placement mt_category
# 14 0x191D660A10738896 13.1220 3.6% 31 0.423290 SELECT mt_entry mt_placement mt_category
# 15 0xF88F7421DD88036D 12.1261 3.4% 61 0.198788 SELECT mt_entry mt_blog mt_objecttag mt_tag mt_author
# 16 0xA909BF76E7051792 10.3971 2.9% 53 0.196172 SELECT mt_entry mt_objecttag mt_tag
# 17 0x3D42D07A335ED983 9.1424 2.5% 20 0.457121 SELECT mt_entry mt_placement mt_category
# 18 0x59F43B57DD43F2BD 9.0533 2.5% 21 0.431111 SELECT mt_entry mt_placement mt_category
# 19 0x7961BD4C76277EB7 8.5564 2.4% 47 0.182052 INSERT UNION UPDATE UNION mt_session
# 20 0x173EB4903F3B6DAC 8.5394 2.4% 22 0.388153 SELECT mt_entry mt_placement mt_category
尽管直方图是基于文本的,但它可以准确显示查询的整体性能,有时运行时间超过1秒,并且大部分时间在0.01到0.1秒之间。从这里开始,可以通过重构查询,将查询结果放置在内存缓存中,添加缺失的索引或覆盖索引等来进行性能调整。
将探查器工具放到Windows GUI中,将很容易与Microsoft的SQL Server Profiler匹敌。
防御之窗!!!
#2 楼
另请参阅有关Jet Profiler for MySQL的答案评论
不错,但是也不会显示正在运行的查询。而是显示“热门查询”。
–User1
2010-1-7 23:25
#3 楼
不,没有这样的工具。评论
同意我发现大多数MySQL开发人员/管理员从未在Microsoft SQL Server上花费很多时间,也没有意识到MS堆栈对于开发而言是多么不可思议。我见过的每个MySQL查询工具都依赖于轮询,但是SQL Server允许您实时观察数据库中几乎发生的所有事情。没有什么比SQL Server Profiler的细节更重要的了,因为MySQL根本不支持它。
–比较器
2015年11月9日下午4:04
#4 楼
将MySQL Query Profiler与GUI结合使用MySQL工具可能与SQL Server Profiler工具差不多了。评论
哎呀,那里没有GUI ...
– Sam Saffron
08-09-24 at 1:44
更糟糕的是,它仍然没有显示实际的流量历史记录。哇,微软在这件事上给Oracle锦上添花!
–User1
2010-1-7 23:18
#5 楼
我发现最好的开箱即用的解决方案是使用慢速查询日志(与Profiler相比很烂)和在端口3306上运行Wireshark(与Profiler相比真的很烂,并且不会)。还有SHOW FULL PROCESSLIST,这就像sys.dm_exec_sessions和sys.dm_exec_requests的精简组合(加上一些sys.dm_exec_sql_text)。 br />
#6 楼
如果您需要分析单个应用程序,而不是MySQL上没有所有数据库,则您会发现Neor Profile SQL非常有用。#7 楼
我们有6台大型服务器,运行从4.1.22到5.1的各种MySQL版本。 Jet profiler很好的工具,它使我们能够一目了然地以图形方式查看所有服务器的状态。可视分析器http://tinyurl.com/profiler-png
#8 楼
我建议与之最接近的是Optimizer Trace(5.6中的新增功能)。另一个示例可能是
SHOW PROFILES
(5.1+)或performance_schema
,它具有MySQL 5.6+的语句级别分析。 />
评论
恕我直言,JetProfiler看起来像是Percona工具以图形方式组合而成。每个都有一个细微的差别。 Linux用户和命令行用户会对Percona Tools或MAATKIT感到满意。 JetProfiler消除了像DB一样的深度,再加上MONyog在Windows上的图形优势,任您选择。
– RolandoMySQLDBA
2011-12-28 22:47