在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匹敌。

防御之窗!!!

评论


恕我直言,JetProfiler看起来像是Percona工具以图形方式组合而成。每个都有一个细微的差别。 Linux用户和命令行用户会对Percona Tools或MAATKIT感到满意。 JetProfiler消除了像DB一样的深度,再加上MONyog在Windows上的图形优势,任您选择。

– RolandoMySQLDBA
2011-12-28 22:47

#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+的语句级别分析。 />

#9 楼

查看有关MySql分析器LogMonitor的答案