您的当前位置:首页正文

mysqlsla 分析mysql慢查询日志

2023-11-10 来源:帮我找美食网

发现有一个工具mysqlsla,分析查询日志比 mysqldumpslow分析的会更清晰明了!安装mysqlsla:下载mysqlsla-2.03.tar.gz[root@yoon export]# tar -xvf mysqlsla-2.03.tar.gz[root@yoon export]# yum install *DBI*[root@yoon mysqlsla-2.03]# perl Makefile.PLCan‘t locate Time/HiRes.pm in @INC (@INC contains: /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5 /usr/share/perl5 .) at /usr/local/bin/mysqlsla line 2095.BEGIN failed--compilation aborted at /usr/local/bin/mysqlsla line 2095.提示报错要安装:[root@yoon mysqlsla-2.03]# yum -y  install perl-Time-HiRes1、总的查询次数(queries)  去重后的SQL数量(unique)2、输出报表的内容排序:Sorted by ‘t_sum‘   最重大的慢sql统计信息, 包括 平均执行时间, 等待锁时间, 结果行的总数, 扫描的行总数3、Count: sql的执行次数及占总的slow log数量的百分比4、Time: 执行时间, 包括总时间, 平均时间, 最小, 最大时间, 时间占到总慢sql时间的百分比5、95% of Time: 去除最快和最慢的sql, 覆盖率占95%的sql的执行时间6、Lock Time: 等待锁的时间7、95% of Lock: 95%的慢sql等待锁时间.  8、Rows sent: 结果行统计数量, 包括平均, 最小, 最大数量9、Rows examined: 扫描的行数量 10、Database: 属于哪个数据库11、Users: 哪个用户,IP, 占到所有用户执行的sql百分比12、Query abstract: 抽象后的sql语句13、Query sample: sql语句参数说明-sort使用什么参数来对分析结果进行排序,默认是t_sum来进行排序t_sum:按总时间排序c_sum:按总次数排序c_sum_p:SQL语句执行次数占总执行次数的百分比-top显示SQL的数量,默认是10,表示按规则取排序的前10条-db-database对应的数据库-statement-filter:过滤SQL语句类型,比如select、update、drop.慢查询日志中,执行时间最长的10条SQLmysqlsla -lt slow  -sf "+select" -top 10  slow.log > yoon.log慢查询日志中slow.log的数据库为sakila的所有select和update的慢查询sql,并查询次数最多的100条sqlmysqlsla -lt slow  -sf "+select,update" -top 100 -sort c_sum -db  sakila slow.log > yoon.log取数据库sakila库中的select语句、按照c_sum_p排序的前2条mysqlsla  -lt  slow  -sort c_sum_p -sf "+select" -db sakila -top2 /export/servers/mysql/log/slow.log 慢查询日志中,取出执行时间最长的3条SQL语句mysqlsla -lt slow  --top 3 slow.log按照总的执行次数mysqlsla -lt slow  --top 3 --sort c_sum slow.log取出create语句的慢查询mysqlsla -lt slow  -sf "+create"--top 3 --sort c_sum slow.log > yoon.log

mysqlsla 分析mysql慢查询日志

标签:

小编还为您整理了以下内容,可能对您也有帮助:

如何在window下启动mysql的慢查询日志

一、MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句1,slow_query_log这个参数设置为ON,可以捕获执行时间超过一定数值的SQL语句。2,long_query_time当SQL语句执行时间超过此数值时,就会被记录到日志中,建议设置为1或者更短。3,slow_query_log_file记录日志的文件名。4,log_queries_not_using_indexes这个参数设置为ON,可以捕获到所有未使用索引的SQL语句,尽管这个SQL语句有可能执行得挺快。二、检测mysql中sql语句的效率的方法1、通过查询日志(1)、Windows下开启MySQL慢查询MySQL在Windows系统中的配置文件一般是是my.ini找到[mysqld]下面加上代码如下log-slow-queries=F:/MySQL/log/mysqlslowquery。loglong_query_time=2(2)、Linux下启用MySQL慢查询MySQL在Windows系统中的配置文件一般是是my.cnf找到[mysqld]下面加上代码如下log-slow-queries=/data/mysqldata/slowquery。loglong_query_time=2说明log-slow-queries=F:/MySQL/log/mysqlslowquery。为慢查询日志存放的位置,一般这个目录要有MySQL的运行帐号的可写权限,一般都将这个目录设置为MySQL的数据存放目录;long_query_time=2中的2表示查询超过两秒才记录;2.showprocesslist命令SHOWPROCESSLIST显示哪些线程正在运行。您也可以使用mysqladminprocesslist语句得到此信息。各列的含义和用途:ID列一个标识,你要kill一个语句的时候很有用,用命令杀掉此查询/*/mysqladminkill进程号。user列显示单前用户,如果不是root,这个命令就只显示你权限范围内的sql语句。host列显示这个语句是从哪个ip的哪个端口上发出的。用于追踪出问题语句的用户。db列显示这个进程目前连接的是哪个数据库。command列显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接(connect)。time列此这个状态持续的时间,单位是秒。state列显示使用当前连接的sql语句的状态,很重要的列,后续会有所有的状态的描述,请注意,state只是语句执行中的某一个状态,一个sql语句,以查询为例,可能需要经过copyingtotmptable,Sortingresult,Sendingdata等状态才可以完成info列显示这个sql语句,因为长度有限,所以长的sql语句就显示不全,但是一个判断问题语句的重要依据。这个命令中最关键的就是state列,mysql列出的状态主要有以下几种:Checkingtable 正在检查数据表(这是自动的)。Closingtables 正在将表中修改的数据刷新到磁盘中,同时正在关闭已经用完的表。这是一个很快的操作,如果不是这样的话,就应该确认磁盘空间是否已经满了或者磁盘是否正处于重负中。ConnectOut 复制从服务器正在连接主服务器。Copyingtotmptableondisk 由于临时结果集大于tmp_table_size,正在将临时表从内存存储转为磁盘存储以此节省内存。Creatingtmptable 正在创建临时表以存放部分查询结果。deletingfrommaintable 服务器正在执行多表删除中的第一部分,刚删除第一个表。deletingfromreferencetables 服务器正在执行多表删除中的第二部分,正在删除其他表的记录。Flushingtables 正在执行FLUSHTABLES,等待其他线程关闭数据表。Killed 发送了一个kill请求给某线程,那么这个线程将会检查kill标志位,同时会放弃下一个kill请求。MySQL会在每次的主循环中检查kill标志位,不过有些情况下该线程可能会过一小段才能死掉。如果该线程程被其他线程锁住了,那么kill请求会在锁释放时马上生效。Locked 被其他查询锁住了。Sendingdata 正在处理SELECT查询的记录,同时正在把结果发送给客户端。Sortingforgroup 正在为GROUPBY做排序。 Sortingfororder 正在为ORDERBY做排序。Openingtables 这个过程应该会很快,除非受到其他因素的干扰。例如,在执ALTERTABLE或LOCKTABLE语句行完以前,数据表无法被其他线程打开。正尝试打开一个表。Removingplicates 正在执行一个SELECTDISTINCT方式的查询,但是MySQL无法在前一个阶段优化掉那些重复的记录。因此,MySQL需要再次去掉重复的记录,然后再把结果发送给客户端。Reopentable 获得了对一个表的锁,但是必须在表结构修改之后才能获得这个锁。已经释放锁,关闭数据表,正尝试重新打开数据表。Repairbysorting 修复指令正在排序以创建索引。Repairwithkeycache 修复指令正在利用索引缓存一个一个地创建新索引。它会比Repairbysorting慢些。Searchingrowsforupdate 正在讲符合条件的记录找出来以备更新。它必须在UPDATE要修改相关的记录之前就完成了。Sleeping 正在等待客户端发送新请求.Systemlock 正在等待取得一个外部的系统锁。如果当前没有运行多个mysqld服务器同时请求同一个表,那么可以通过增加--skip-external-locking参数来禁止外部系统锁。Upgradinglock INSERTDELAYED正在尝试取得一个锁表以插入新记录。Updating 正在搜索匹配的记录,并且修改它们。UserLock 正在等待GET_LOCK()。Waitingfortables 该线程得到通知,数据表结构已经被修改了,需要重新打开数据表以取得新的结构。然后,为了能的重新打开数据表,必须等到所有其他线程关闭这个表。以下几种情况下会产生这个通知:FLUSHTABLEStbl_name,ALTERTABLE,RENAMETABLE,REPAIRTABLE,ANALYZETABLE,或OPTIMIZETABLE。waitingforhandlerinsert INSERTDELAYED已经处理完了所有待处理的插入操作,正在等待新的请求。 大部分状态对应很快的操作,只要有一个线程保持同一个状态好几秒钟,那么可能是有问题发生了,需要检查一下。 还有其他的状态没在上面中列出来,不过它们大部分只是在查看服务器是否有存在错误是才用得着。例如如图:3、explain来了解SQL执行的状态explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。使用方法,在select语句前加上explain就可以了:例如:explainselectsurname,first_nameforma,bwherea.id=b.id结果如图EXPLAIN列的解释table显示这一行的数据是关于哪张表的type这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALLpossible_keys显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句key实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USEINDEX(indexname)来强制使用一个索引或者用IGNOREINDEX(indexname)来强制MYSQL忽略索引key_len使用的索引的长度。在不损失精确性的情况下,长度越短越好ref显示索引的哪一列被使用了,如果可能的话,是一个常数rowsMYSQL认为必须检查的用来返回请求数据的行数Extra关于MYSQL如何解析查询的额外信息。将在表4.3中讨论,但这里可以看到的坏的例子是Usingtemporary和Usingfilesort,意思MYSQL根本不能使用索引,结果是检索会很慢extra列返回的描述的意义Distinct一旦MYSQL找到了与行相联合匹配的行,就不再搜索了NotexistsMYSQL优化了LEFTJOIN,一旦它找到了匹配LEFTJOIN标准的行,就不再搜索了RangecheckedforeachRecord(indexmap:#)没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一Usingfilesort看到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行Usingindex列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候Usingtemporary看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDERBY上,而不是GROUPBY上Whereused使用了WHERE从句来*哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题不同连接类型的解释(按照效率高低的顺序排序)const表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待eq_ref在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用ref这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好range这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西时发生的情况index这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)ALL这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免

如何在window下启动mysql的慢查询日志

一、MySQL数据库有几个配置选项可以帮助我们及时捕获低效SQL语句1,slow_query_log这个参数设置为ON,可以捕获执行时间超过一定数值的SQL语句。2,long_query_time当SQL语句执行时间超过此数值时,就会被记录到日志中,建议设置为1或者更短。3,slow_query_log_file记录日志的文件名。4,log_queries_not_using_indexes这个参数设置为ON,可以捕获到所有未使用索引的SQL语句,尽管这个SQL语句有可能执行得挺快。二、检测mysql中sql语句的效率的方法1、通过查询日志(1)、Windows下开启MySQL慢查询MySQL在Windows系统中的配置文件一般是是my.ini找到[mysqld]下面加上代码如下log-slow-queries=F:/MySQL/log/mysqlslowquery。loglong_query_time=2(2)、Linux下启用MySQL慢查询MySQL在Windows系统中的配置文件一般是是my.cnf找到[mysqld]下面加上代码如下log-slow-queries=/data/mysqldata/slowquery。loglong_query_time=2说明log-slow-queries=F:/MySQL/log/mysqlslowquery。为慢查询日志存放的位置,一般这个目录要有MySQL的运行帐号的可写权限,一般都将这个目录设置为MySQL的数据存放目录;long_query_time=2中的2表示查询超过两秒才记录;2.showprocesslist命令SHOWPROCESSLIST显示哪些线程正在运行。您也可以使用mysqladminprocesslist语句得到此信息。各列的含义和用途:ID列一个标识,你要kill一个语句的时候很有用,用命令杀掉此查询/*/mysqladminkill进程号。user列显示单前用户,如果不是root,这个命令就只显示你权限范围内的sql语句。host列显示这个语句是从哪个ip的哪个端口上发出的。用于追踪出问题语句的用户。db列显示这个进程目前连接的是哪个数据库。command列显示当前连接的执行的命令,一般就是休眠(sleep),查询(query),连接(connect)。time列此这个状态持续的时间,单位是秒。state列显示使用当前连接的sql语句的状态,很重要的列,后续会有所有的状态的描述,请注意,state只是语句执行中的某一个状态,一个sql语句,以查询为例,可能需要经过copyingtotmptable,Sortingresult,Sendingdata等状态才可以完成info列显示这个sql语句,因为长度有限,所以长的sql语句就显示不全,但是一个判断问题语句的重要依据。这个命令中最关键的就是state列,mysql列出的状态主要有以下几种:Checkingtable 正在检查数据表(这是自动的)。Closingtables 正在将表中修改的数据刷新到磁盘中,同时正在关闭已经用完的表。这是一个很快的操作,如果不是这样的话,就应该确认磁盘空间是否已经满了或者磁盘是否正处于重负中。ConnectOut 复制从服务器正在连接主服务器。Copyingtotmptableondisk 由于临时结果集大于tmp_table_size,正在将临时表从内存存储转为磁盘存储以此节省内存。Creatingtmptable 正在创建临时表以存放部分查询结果。deletingfrommaintable 服务器正在执行多表删除中的第一部分,刚删除第一个表。deletingfromreferencetables 服务器正在执行多表删除中的第二部分,正在删除其他表的记录。Flushingtables 正在执行FLUSHTABLES,等待其他线程关闭数据表。Killed 发送了一个kill请求给某线程,那么这个线程将会检查kill标志位,同时会放弃下一个kill请求。MySQL会在每次的主循环中检查kill标志位,不过有些情况下该线程可能会过一小段才能死掉。如果该线程程被其他线程锁住了,那么kill请求会在锁释放时马上生效。Locked 被其他查询锁住了。Sendingdata 正在处理SELECT查询的记录,同时正在把结果发送给客户端。Sortingforgroup 正在为GROUPBY做排序。 Sortingfororder 正在为ORDERBY做排序。Openingtables 这个过程应该会很快,除非受到其他因素的干扰。例如,在执ALTERTABLE或LOCKTABLE语句行完以前,数据表无法被其他线程打开。正尝试打开一个表。Removingplicates 正在执行一个SELECTDISTINCT方式的查询,但是MySQL无法在前一个阶段优化掉那些重复的记录。因此,MySQL需要再次去掉重复的记录,然后再把结果发送给客户端。Reopentable 获得了对一个表的锁,但是必须在表结构修改之后才能获得这个锁。已经释放锁,关闭数据表,正尝试重新打开数据表。Repairbysorting 修复指令正在排序以创建索引。Repairwithkeycache 修复指令正在利用索引缓存一个一个地创建新索引。它会比Repairbysorting慢些。Searchingrowsforupdate 正在讲符合条件的记录找出来以备更新。它必须在UPDATE要修改相关的记录之前就完成了。Sleeping 正在等待客户端发送新请求.Systemlock 正在等待取得一个外部的系统锁。如果当前没有运行多个mysqld服务器同时请求同一个表,那么可以通过增加--skip-external-locking参数来禁止外部系统锁。Upgradinglock INSERTDELAYED正在尝试取得一个锁表以插入新记录。Updating 正在搜索匹配的记录,并且修改它们。UserLock 正在等待GET_LOCK()。Waitingfortables 该线程得到通知,数据表结构已经被修改了,需要重新打开数据表以取得新的结构。然后,为了能的重新打开数据表,必须等到所有其他线程关闭这个表。以下几种情况下会产生这个通知:FLUSHTABLEStbl_name,ALTERTABLE,RENAMETABLE,REPAIRTABLE,ANALYZETABLE,或OPTIMIZETABLE。waitingforhandlerinsert INSERTDELAYED已经处理完了所有待处理的插入操作,正在等待新的请求。 大部分状态对应很快的操作,只要有一个线程保持同一个状态好几秒钟,那么可能是有问题发生了,需要检查一下。 还有其他的状态没在上面中列出来,不过它们大部分只是在查看服务器是否有存在错误是才用得着。例如如图:3、explain来了解SQL执行的状态explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。使用方法,在select语句前加上explain就可以了:例如:explainselectsurname,first_nameforma,bwherea.id=b.id结果如图EXPLAIN列的解释table显示这一行的数据是关于哪张表的type这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALLpossible_keys显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句key实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USEINDEX(indexname)来强制使用一个索引或者用IGNOREINDEX(indexname)来强制MYSQL忽略索引key_len使用的索引的长度。在不损失精确性的情况下,长度越短越好ref显示索引的哪一列被使用了,如果可能的话,是一个常数rowsMYSQL认为必须检查的用来返回请求数据的行数Extra关于MYSQL如何解析查询的额外信息。将在表4.3中讨论,但这里可以看到的坏的例子是Usingtemporary和Usingfilesort,意思MYSQL根本不能使用索引,结果是检索会很慢extra列返回的描述的意义Distinct一旦MYSQL找到了与行相联合匹配的行,就不再搜索了NotexistsMYSQL优化了LEFTJOIN,一旦它找到了匹配LEFTJOIN标准的行,就不再搜索了RangecheckedforeachRecord(indexmap:#)没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一Usingfilesort看到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来排序全部行Usingindex列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求列都是同一个索引的部分的时候Usingtemporary看到这个的时候,查询需要优化了。这里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDERBY上,而不是GROUPBY上Whereused使用了WHERE从句来*哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题不同连接类型的解释(按照效率高低的顺序排序)const表中的一个记录的最大值能够匹配这个查询(索引可以是主键或惟一索引)。因为只有一行,这个值实际就是常数,因为MYSQL先读这个值然后把它当做常数来对待eq_ref在连接中,MYSQL在查询时,从前面的表中,对每一个记录的联合都从表中读取一个记录,它在查询使用了索引为主键或惟一键的全部时使用ref这个连接类型只有在查询使用了不是惟一或主键的键或者是这些类型的部分(比如,利用最左边前缀)时发生。对于之前的表的每一个行联合,全部记录都将从表中读出。这个类型严重依赖于根据索引匹配的记录多少—越少越好range这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西时发生的情况index这个连接类型对前面的表中的每一个记录联合进行完全扫描(比ALL更好,因为索引一般小于表数据)ALL这个连接类型对于前面的每一个记录联合进行完全扫描,这一般比较糟糕,应该尽量避免

什么工具可以分析mysql慢查询日志

这是一个慢查询日志的展示工具,能够帮助 DBA 或者开发人员分析数据库的性能问题,给出全面的数据摆脱直接查看 slow-log。QAN(Query Analytics)

PMM 目前有 2 个版本,但是对于 QAN 来说其大致由三部分组成:

QAN-Agent(client):负责采集 slow-log 的数据并上报到服务端

QAN-API(server):负责存储采集的数据,并对外提供查询接口

QAN-APP:专门用来展示慢查询数据的 grafana 第三方插件

1. 数据流转

slow-log --> QAN-Agent --> QAN-API <--> QAN-APP(grafana)

2. pmm1 架构图

3. pmm2 架构图

什么工具可以分析mysql慢查询日志

这是一个慢查询日志的展示工具,能够帮助 DBA 或者开发人员分析数据库的性能问题,给出全面的数据摆脱直接查看 slow-log。QAN(Query Analytics)

PMM 目前有 2 个版本,但是对于 QAN 来说其大致由三部分组成:

QAN-Agent(client):负责采集 slow-log 的数据并上报到服务端

QAN-API(server):负责存储采集的数据,并对外提供查询接口

QAN-APP:专门用来展示慢查询数据的 grafana 第三方插件

1. 数据流转

slow-log --> QAN-Agent --> QAN-API <--> QAN-APP(grafana)

2. pmm1 架构图

3. pmm2 架构图

mysql如何优化以下语句,查询耗时太久了?

一般进行性能分析,分如下三步:

首先需要使用慢查询日志功能,去获取所有查询时间比较长的SQL语句

其次查看执行计划查看有问题的SQL的执行计划 explain

最后可以使用show profile查看有问题的SQL的性能使用情况

慢查询日志分析

首先我们要使用慢查询日志,因为它收集了查询时间比较长的SQL语句,但使用之前必须开启慢查询日志,在配置文件my.cnf(一般为/etc/my.cnf)中的[mysqld] 增加如下参数:

slow_query_log=ONlong_query_time=3slow_query_log_file=/var/lib/mysql/slow-log.log复制代码

增加这些参数之后,重启MySQL,可以进行查询慢查询日志是否开启。

1. 任何地方都不要使用 select * from t,用具体的字段列表代替“*“,不要返回用不到的任何字段。

2. 索引并不是越多越好,索引固然可以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为 insert 或 update 时有可能会重建索引,所以怎样建索引需要慎重考虑,视具体情况而定。一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。

3. 并不是所有索引对查询都有效,SQL是根据表中数据来进行查询优化的,当索引列有大量数据重复时,SQL查询可能不会去利用索引,如一表中有字段sex,male、female几乎各一半,那么即使在sex上建了索引也对查询效率起不了作用。

4. 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。这是因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

5. 尽可能的使用 varchar 代替 char ,因为首先变长字段存储空间小,可以节省存储空间, 其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

6. 如果使用到了临时表,在存储过程的最后务必将所有的临时表显式删除,先 truncate table ,然后 drop table ,这样可以避免系统表的较长时间锁定。

7. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where和order by相关的列上建立索引。

8. 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。

例如: select * from t where num is null

我们可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select * from t where num=0。

mysql 慢查询日志怎么导出来

mysql 慢查询日志 导出来的方法

    在MySQL客户端中输入命令:

    show variables like '%quer%';

    其中红框标注的选项是:

    -slow_query_log是否记录慢查询。用long_query_time变量的值来确定“慢查询”。

    -slow_query_log_file慢日志文件路径

    -long_query_time慢日志执行时长(秒),超过设定的时间才会记日志

    Linux:

    在/etc/my.cnf配置文件的[mysqld]选项下增加:

    slow_query_log=TRUE

    slow_query_log_file=/usr/local/mysql/slow_query_log.txt

    long_query_time=3

    Windows:

    在my.ini配置文件的[mysqld]选项下增加:

    slow_query_log=TRUE

    slow_query_log_file=c:/slow_query_log.txt

    long_query_time=3

    重启MySQL后,可发现已经开启慢查询日志

mysql 慢查询日志怎么导出来

mysql 慢查询日志 导出来的方法

    在MySQL客户端中输入命令:

    show variables like '%quer%';

    其中红框标注的选项是:

    -slow_query_log是否记录慢查询。用long_query_time变量的值来确定“慢查询”。

    -slow_query_log_file慢日志文件路径

    -long_query_time慢日志执行时长(秒),超过设定的时间才会记日志

    Linux:

    在/etc/my.cnf配置文件的[mysqld]选项下增加:

    slow_query_log=TRUE

    slow_query_log_file=/usr/local/mysql/slow_query_log.txt

    long_query_time=3

    Windows:

    在my.ini配置文件的[mysqld]选项下增加:

    slow_query_log=TRUE

    slow_query_log_file=c:/slow_query_log.txt

    long_query_time=3

    重启MySQL后,可发现已经开启慢查询日志

五款常用mysql slow log分析工具的比较

mysql slow log 是用来记录执行时间较长(超过long_query_time秒)的sql的一种日志工具

启用 slow log

有两种启用方式:

在f 里 通过 log slow queries[=file_name]

在mysqld进程启动时 指定–log slow queries[=file_name]选项

比较的五款常用工具

mysqlmpslow mysqlsla myprofi mysql explain slow log mysqllogfilter

mysqlmpslow mysql官方提供的慢查询日志分析工具 输出图表如下:

        主要功能是 统计不同慢sql的

出现次数(Count)

执行最长时间(Time)

累计总耗费时间(Time)

等待锁的时间(Lock)

发送给客户端的行总数(Rows)

扫描的行总数(Rows)

用户以及sql语句本身(抽象了一下格式 比如 limit 用 limit N N 表示)

mysqlsla 推出的一款日志分析工具(该网站还维护了 mysqlreport mysqlidxc 等比较实用的mysql工具)

        整体来说 功能非常强大 数据报表 非常有利于分析慢查询的原因 包括执行频率 数据量 查询消耗等

格式说明如下:

总查询次数 (queries total) 去重后的sql数量 (unique)

输出报表的内容排序(sorted by)

最重大的慢sql统计信息 包括 平均执行时间 等待锁时间 结果行的总数 扫描的行总数

Count sql的执行次数及占总的slow log数量的百分比

Time 执行时间 包括总时间 平均时间 最小 最大时间 时间占到总慢sql时间的百分比

% of Time 去除最快和最慢的sql 覆盖率占 %的sql的执行时间

Lock Time 等待锁的时间

% of Lock %的慢sql等待锁时间

Rows sent 结果行统计数量 包括平均 最小 最大数量

Rows examined 扫描的行数量

Database 属于哪个数据库

Users 哪个用户 IP 占到所有用户执行的sql百分比

Query abstract 抽象后的sql语句

Query sample sql语句

除了以上的输出 官方还提供了很多定制化参数 是一款不可多得的好工具

mysql explain slow log 德国人写的一个perl脚本

        功能上有点瑕疵 不仅把所有的 slow log 打印到屏幕上 而且统计也只有数量而已 不推荐使用

mysql log filter google code上找到的一个分析工具 提供了 python 和 php 两种可执行的脚本

log filter/

        功能上比官方的mysqlmpslow 多了查询时间的统计信息(平均 最大 累计) 其他功能都与 mysqlmpslow类似

特色功能除了统计信息外 还针对输出内容做了排版和格式化 保证整体输出的简洁 喜欢简洁报表的朋友 推荐使用一下

myprofi 纯php写的一个开源分析工具 项目在 sourcefe 上

        功能上 列出了总的慢查询次数和类型 去重后的sql语句 执行次数及其占总的slow log数量的百分比

从整体输出样式来看 比mysql log filter还要简洁 省去了很多不必要的内容 对于只想看sql语句及执行次数的用户来说 比较推荐

总结

工具/功能 一般统计信息 高级统计信息 脚本 优势 mysqlmpslow 支持 不支持 perl mysql官方自带 mysqlsla 支持 支持 perl 功能强大 数据报表齐全 定制化能力强 mysql explain slow log 支持 不支持 perl 无 mysql log filter 支持 部分支持 python or php 不失功能的前提下 保持输出简洁 myprofi 支持 不支持 php 非常精简

lishixin/Article/program/MySQL/201311/29428

    五款常用mysql slow log分析工具的比较

    mysql slow log 是用来记录执行时间较长(超过long_query_time秒)的sql的一种日志工具

    启用 slow log

    有两种启用方式:

    在f 里 通过 log slow queries[=file_name]

    在mysqld进程启动时 指定–log slow queries[=file_name]选项

    比较的五款常用工具

    mysqlmpslow mysqlsla myprofi mysql explain slow log mysqllogfilter

    mysqlmpslow mysql官方提供的慢查询日志分析工具 输出图表如下:

            主要功能是 统计不同慢sql的

    出现次数(Count)

    执行最长时间(Time)

    累计总耗费时间(Time)

    等待锁的时间(Lock)

    发送给客户端的行总数(Rows)

    扫描的行总数(Rows)

    用户以及sql语句本身(抽象了一下格式 比如 limit 用 limit N N 表示)

    mysqlsla 推出的一款日志分析工具(该网站还维护了 mysqlreport mysqlidxc 等比较实用的mysql工具)

            整体来说 功能非常强大 数据报表 非常有利于分析慢查询的原因 包括执行频率 数据量 查询消耗等

    格式说明如下:

    总查询次数 (queries total) 去重后的sql数量 (unique)

    输出报表的内容排序(sorted by)

    最重大的慢sql统计信息 包括 平均执行时间 等待锁时间 结果行的总数 扫描的行总数

    Count sql的执行次数及占总的slow log数量的百分比

    Time 执行时间 包括总时间 平均时间 最小 最大时间 时间占到总慢sql时间的百分比

    % of Time 去除最快和最慢的sql 覆盖率占 %的sql的执行时间

    Lock Time 等待锁的时间

    % of Lock %的慢sql等待锁时间

    Rows sent 结果行统计数量 包括平均 最小 最大数量

    Rows examined 扫描的行数量

    Database 属于哪个数据库

    Users 哪个用户 IP 占到所有用户执行的sql百分比

    Query abstract 抽象后的sql语句

    Query sample sql语句

    除了以上的输出 官方还提供了很多定制化参数 是一款不可多得的好工具

    mysql explain slow log 德国人写的一个perl脚本

            功能上有点瑕疵 不仅把所有的 slow log 打印到屏幕上 而且统计也只有数量而已 不推荐使用

    mysql log filter google code上找到的一个分析工具 提供了 python 和 php 两种可执行的脚本

    log filter/

            功能上比官方的mysqlmpslow 多了查询时间的统计信息(平均 最大 累计) 其他功能都与 mysqlmpslow类似

    特色功能除了统计信息外 还针对输出内容做了排版和格式化 保证整体输出的简洁 喜欢简洁报表的朋友 推荐使用一下

    myprofi 纯php写的一个开源分析工具 项目在 sourcefe 上

            功能上 列出了总的慢查询次数和类型 去重后的sql语句 执行次数及其占总的slow log数量的百分比

    从整体输出样式来看 比mysql log filter还要简洁 省去了很多不必要的内容 对于只想看sql语句及执行次数的用户来说 比较推荐

    总结

    工具/功能 一般统计信息 高级统计信息 脚本 优势 mysqlmpslow 支持 不支持 perl mysql官方自带 mysqlsla 支持 支持 perl 功能强大 数据报表齐全 定制化能力强 mysql explain slow log 支持 不支持 perl 无 mysql log filter 支持 部分支持 python or php 不失功能的前提下 保持输出简洁 myprofi 支持 不支持 php 非常精简

    lishixin/Article/program/MySQL/201311/29428

      mysql开启慢查询怎么把每天日志文件分开

      首先,我们需要查看mysql server版本号,以及是否配置启用了slow query log。
      #打开服务
      log_slow_queries = ON
      当log_slow_queries是ON时,才表示已经启用了记录slow query功能。默认是不记录slow query的。
      启用slow query日志
      #//将下列配置放到my.cnf中
      [mysqld]
      log-slow-queries = /var/lib/mysql/slow-queries.log
      //新增加的参数
      long_query_time = 3
      log-queries-not-using-indexes
      log-slow-admin-statements
      上面的配置打开了slow query日志,将会捕获了执行时间超过了3秒的查询,包括执行速度较慢的管理命令(比如OPTIMEZE TABLE),并且记录了没有使用索引的查询。这些SQL,都会被记录到log-slow-queries指定的文件/var/lib/mysql/slow-queries.log文件中。
      log-slow-queries <slow_query_log_file>
      存放slow query日志的文件。你必须保证mysql server进程mysqld_safe进程用户对该文件有w权限。
      long_query_time
      如果query time超过了该值,则认为是较慢查询,并被记录下来。单位是秒,最小值是1,默认值是10秒。10秒对于大多数应用来讲,太长了。我们推荐从3秒开始, 依次减少,每次都找出最”昂贵”的10条SQL语句并且优化他们。日复一日,一步一步优化。一次性找出很多条SQL语句,对于优化来讲,意义并不大。
      log-queries-not-using-indexes
      MySQL会将没有使用索引的查询记录到slow query日志中。无论它执行有多快,查询语句没有使用索引,都会被记录。有的时候,有些没有使用引索的查询非常快(例如扫描很小的表),但也有可能导致服务器变慢,甚至还会使用大量的磁盘空间。
      log-slow-admin-statements
      一些管理指令,也会被记录。比如OPTIMEZE TABLE, ALTER TABLE等等。
      日志文件

      mysql开启慢查询怎么把每天日志文件分开

      首先,我们需要查看mysql server版本号,以及是否配置启用了slow query log。
      #打开服务
      log_slow_queries = ON
      当log_slow_queries是ON时,才表示已经启用了记录slow query功能。默认是不记录slow query的。
      启用slow query日志
      #//将下列配置放到my.cnf中
      [mysqld]
      log-slow-queries = /var/lib/mysql/slow-queries.log
      //新增加的参数
      long_query_time = 3
      log-queries-not-using-indexes
      log-slow-admin-statements
      上面的配置打开了slow query日志,将会捕获了执行时间超过了3秒的查询,包括执行速度较慢的管理命令(比如OPTIMEZE TABLE),并且记录了没有使用索引的查询。这些SQL,都会被记录到log-slow-queries指定的文件/var/lib/mysql/slow-queries.log文件中。
      log-slow-queries <slow_query_log_file>
      存放slow query日志的文件。你必须保证mysql server进程mysqld_safe进程用户对该文件有w权限。
      long_query_time
      如果query time超过了该值,则认为是较慢查询,并被记录下来。单位是秒,最小值是1,默认值是10秒。10秒对于大多数应用来讲,太长了。我们推荐从3秒开始, 依次减少,每次都找出最”昂贵”的10条SQL语句并且优化他们。日复一日,一步一步优化。一次性找出很多条SQL语句,对于优化来讲,意义并不大。
      log-queries-not-using-indexes
      MySQL会将没有使用索引的查询记录到slow query日志中。无论它执行有多快,查询语句没有使用索引,都会被记录。有的时候,有些没有使用引索的查询非常快(例如扫描很小的表),但也有可能导致服务器变慢,甚至还会使用大量的磁盘空间。
      log-slow-admin-statements
      一些管理指令,也会被记录。比如OPTIMEZE TABLE, ALTER TABLE等等。
      日志文件

      MySQL怎么查询比较耗时的sql语句

      开启慢查询日志即可

      文件方式配置

      MySQL

      慢查询的方法:

      mysql

      配置文件

      my.cnf

      中增加:

      log-slow-queries=/opt/data/slowquery.log

      long_query_time=2

      log-queries-not-using-indexes

      命令方式配置

      MySQL

      慢查询的方法:

      set

      global

      slow_query_log=on;

      set

      global

      long_query_time=1;

      set

      global

      slow_query_log_file=‘/opt/data/slow_query.log’;

      查询

      MySQL

      慢查询状态的方法:

      SHOW

      VARIABLES

      LIKE

      '%query%';

      解析

      MySQL

      慢查询日志的方法:

      按照

      sql

      执行时间最长的前

      20.条

      sql:

      mysqlmpslow

      -s

      t

      -t

      20.-g

      'select'

      /opt/data/slowquery.log

      如何开启mysql的慢查询

      1,配置开启

      Linux:

      在mysql配置文件my.cnf中增加

      log-slow-queries=/var/lib/mysql/slowquery.log (指定日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.log)
      long_query_time=2 (记录超过的时间,默认为10s)
      log-queries-not-using-indexes (log下来没有使用索引的query,可以根据情况决定是否开启)
      log-long-format (如果设置了,所有没有使用索引的查询也将被记录)

      Windows:

      在my.ini的[mysqld]添加如下语句:
      log-slow-queries = E:webmysqllogmysqlslowquery.log
      long_query_time = 2(其他参数如上)

      2,查看方式

      Linux:

      使用mysql自带命令mysqlmpslow查看

      常用命令

      -s ORDER what to sort by (t, at, l, al, r, ar etc), 'at’ is default
      -t NUM just show the top n queries
      -g PATTERN grep: only consider stmts that include this string

      s,是order的顺序,说明写的不够详细,包括看了代码,主要有 c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒序 -t,是top  n的意思,即为返回前面多少条的数据 -g,后边可以写一个正则匹配模式,大小写不敏感的

      mysqlmpslow -s c -t 20 host-slow.log
      mysqlmpslow -s r -t 20 host-slow.log

      上述命令可以看出访问次数最多的20个sql语句和返回记录集最多的20个sql。

      mysqlmpslow -t 10 -s t -g “left join” host-slow.log这个是按照时间返回前10条里面含有左连接的sql语句。

      如何开启mysql的慢查询

      1,配置开启

      Linux:

      在mysql配置文件my.cnf中增加

      log-slow-queries=/var/lib/mysql/slowquery.log (指定日志文件存放位置,可以为空,系统会给一个缺省的文件host_name-slow.log)
      long_query_time=2 (记录超过的时间,默认为10s)
      log-queries-not-using-indexes (log下来没有使用索引的query,可以根据情况决定是否开启)
      log-long-format (如果设置了,所有没有使用索引的查询也将被记录)

      Windows:

      在my.ini的[mysqld]添加如下语句:
      log-slow-queries = E:webmysqllogmysqlslowquery.log
      long_query_time = 2(其他参数如上)

      2,查看方式

      Linux:

      使用mysql自带命令mysqlmpslow查看

      常用命令

      -s ORDER what to sort by (t, at, l, al, r, ar etc), 'at’ is default
      -t NUM just show the top n queries
      -g PATTERN grep: only consider stmts that include this string

      s,是order的顺序,说明写的不够详细,包括看了代码,主要有 c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒序 -t,是top  n的意思,即为返回前面多少条的数据 -g,后边可以写一个正则匹配模式,大小写不敏感的

      mysqlmpslow -s c -t 20 host-slow.log
      mysqlmpslow -s r -t 20 host-slow.log

      上述命令可以看出访问次数最多的20个sql语句和返回记录集最多的20个sql。

      mysqlmpslow -t 10 -s t -g “left join” host-slow.log这个是按照时间返回前10条里面含有左连接的sql语句。

      如何查看mysql数据库操作记录日志

      1、首先确认你日志是否启用了mysql>show variables like 'log_bin'。

      2、如果启用了,即ON,那日志文件就在mysql的安装目录的data目录下。

      3、怎样知道当前的日志mysql> show master status。

      4、看二进制日志文件用mysqlbinlog,shell>mysqlbinlog mail-bin.000001或者shell>mysqlbinlog mail-bin.000001 | tail,Windows 下用类似的。

      MySQL的日志操作:

      1、首先,登陆mysql后,执行sql语句:show variables like 'log_bin'。

      2、#错误日志log-errol开启方式:在my.ini的[mysqld]选项下:添加代码:log-error=E:log-error.txt。

      记录内容:主要是记录启动、运行或停止mysqld时出现的致命性问题,都是系统级的错误记录。

      3、#查询日志:log,开启方式:在my.ini的[mysqld]选项下:添加代码:log=E:/mysql_log.txt。

      4、#二进制日志:log-bin,开启方式:在my.ini的[mysqld]选项下:添加代码:log-bin=E:/mysql_log_bin,记录内容:主要是记录所有的更改数据的语句,可使用mysqlbinlog命令恢复数据。

      开启mysql慢查询 的话 对系统性能影响大么

      mysql慢查询日志对于跟踪有问题的查询非常有用,可以分析出当前程序里有很耗费资源的sql语句,那如何打开mysql的慢查询日志记录呢?其实打开mysql的慢查询日志很简单,只需要在mysql的配置文件里(windows系统是myf)的[mysqld]下面加上如下代码: 复制代码 代码如下: log-slow-queries=/var/lib/mysql/slowqueryf或my.ini中加入下面这一行可以记录这些查询 这是一个有用的日志。它对于性能的影响不大(假设所有查询都很快),并且强调了那些最需要注意的查询(丢失了索引或索引没有得到最佳应用) # Time: 070927 8:08:52 # User@Host: root[root] @ [192.168.0.20] # Query_time: 372 Lock_time: 136 Rows_sent: 152 Rows_examined: 263630 select id, name from manager where id in (66,10135); 这是慢查询日志中的一条,用了372秒,锁了136秒,返回152行,一共查了263630行 如果日志内容很多,用眼睛一条一条去看会累死,mysql自带了分析的工具,使用方法如下: 命令行下,进入mysql/bin目录,输入mysqlmpslow –help或--help可以看到这个工具的参数,主要有 Usage: mysqlmpslow [ OPTS... ] [ LOGS... ] Parse and summarize the MySQL slow query log. Options are --verbose verbose --debug debug --help write this text to standard output -v verbose -d debug -s ORDER what to sort by (t, at, l, al, r, ar etc), 'at' is default -r reverse the sort order (largest last instead of first) -t NUM just show the top n queries -a don't abstract all numbers to N and strings to 'S' -n NUM abstract numbers with at least n digits within names -g PATTERN grep: only consider stmts that include this string -h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard), default is '*', i.e. match all -i NAME name of server instance (if using mysql.server startup scrīpt) -l don't subtract lock time from total time -s,是order的顺序,说明写的不够详细,俺用下来,包括看了代码,主要有 c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒叙 -t,是top n的意思,即为返回前面多少条的数据 -g,后边可以写一个正则匹配模式,大小写不敏感的 mysqlmpslow -s c -t 20 host-slow.log mysqlmpslow -s r -t 20 host-slow.log 上述命令可以看出访问次数最多的20个sql语句和返回记录集最多的20个sql。 mysqlmpslow -t 10 -s t -g “left join” host-slow.log 这个是按照时间返回前10条里面含有左连接的sql语句。

      开启mysql慢查询 的话 对系统性能影响大么

      mysql慢查询日志对于跟踪有问题的查询非常有用,可以分析出当前程序里有很耗费资源的sql语句,那如何打开mysql的慢查询日志记录呢?其实打开mysql的慢查询日志很简单,只需要在mysql的配置文件里(windows系统是myf)的[mysqld]下面加上如下代码: 复制代码 代码如下: log-slow-queries=/var/lib/mysql/slowqueryf或my.ini中加入下面这一行可以记录这些查询 这是一个有用的日志。它对于性能的影响不大(假设所有查询都很快),并且强调了那些最需要注意的查询(丢失了索引或索引没有得到最佳应用) # Time: 070927 8:08:52 # User@Host: root[root] @ [192.168.0.20] # Query_time: 372 Lock_time: 136 Rows_sent: 152 Rows_examined: 263630 select id, name from manager where id in (66,10135); 这是慢查询日志中的一条,用了372秒,锁了136秒,返回152行,一共查了263630行 如果日志内容很多,用眼睛一条一条去看会累死,mysql自带了分析的工具,使用方法如下: 命令行下,进入mysql/bin目录,输入mysqlmpslow –help或--help可以看到这个工具的参数,主要有 Usage: mysqlmpslow [ OPTS... ] [ LOGS... ] Parse and summarize the MySQL slow query log. Options are --verbose verbose --debug debug --help write this text to standard output -v verbose -d debug -s ORDER what to sort by (t, at, l, al, r, ar etc), 'at' is default -r reverse the sort order (largest last instead of first) -t NUM just show the top n queries -a don't abstract all numbers to N and strings to 'S' -n NUM abstract numbers with at least n digits within names -g PATTERN grep: only consider stmts that include this string -h HOSTNAME hostname of db server for *-slow.log filename (can be wildcard), default is '*', i.e. match all -i NAME name of server instance (if using mysql.server startup scrīpt) -l don't subtract lock time from total time -s,是order的顺序,说明写的不够详细,俺用下来,包括看了代码,主要有 c,t,l,r和ac,at,al,ar,分别是按照query次数,时间,lock的时间和返回的记录数来排序,前面加了a的时倒叙 -t,是top n的意思,即为返回前面多少条的数据 -g,后边可以写一个正则匹配模式,大小写不敏感的 mysqlmpslow -s c -t 20 host-slow.log mysqlmpslow -s r -t 20 host-slow.log 上述命令可以看出访问次数最多的20个sql语句和返回记录集最多的20个sql。 mysqlmpslow -t 10 -s t -g “left join” host-slow.log 这个是按照时间返回前10条里面含有左连接的sql语句。

      Top