[MySQL优化] -- 如何定位效率较低的SQL

一般通过以下两种方式定位执行效率较低的 SQL 语句。

  • 通过慢查询日志定位那些执行效率较低的 SQL 语句,用 --log-slow-queries[=file_name] 选项启动时, mysqld 会 写一个包含所有执行时间超过 long_query_time 秒的 SQL 语句的日志文件,通过查看这个日志文件定位效率较低的 SQL 。
  • 慢查询日志在查询结束以后才纪录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用 show processlist 命令查看当前 MySQL 在进行的线程,包括线程的状态、是否锁表等,可以实时地查看 SQL 的 执行情况,同时对一些锁表操作进行优化。

下面我们举例说明一下,如何通过慢查询日志定位执行效率底的 SQL 语句: 
开启慢查询日志 , 配置样例: 
[mysqld] 
log-slow-queries 
在 my.cnf 配置文件中增加上述配置项并重启 mysql 服务,这时 mysql 慢查询功能生效。慢查询 日志将写入参数 DATADIR (数据目录)指定的路径下,默认文件名是 host_name-slow.log 。 
和错误日志、查询日志一样,慢查询日志记录的格式也是纯文本,可以被直接读取。下例中演示了慢查询日志的设置和读取过程。 
( 1 )首先查询一下 long_query_time 的值 。 
mysql> show variables like ‘long%‘; 
+-----------------+-------+ 
| Variable_name | Value | 
+-----------------+-------+ 
| long_query_time | 10 | 
+-----------------+-------+ 
1 row in set (0.00 sec) 
( 2 )为了方便测试,将修改慢查询时间为 5 秒。 
mysql> set long_query_time=5; 
Query OK, 0 rows affected (0.02 sec) 
( 3 )依次执行下面两个查询语句。 
第一个查询因为查询时间低于 5 秒而不会出现在慢查询日志中: 
mysql> select count(*) from order2008; 
+----------+ 
| count(*) | 
+----------+ 
| 208 | 
+----------+ 
1 row in set (0.00 sec) 
第二个查询因为查询时间大于 5 秒而应该出现在慢查询日志中: 
mysql> select count(*) from t_user; 
+----------+ 
| count(*) | 
+----------+ 
| 6552961 | 
+----------+ 
1 row in set (11.07 sec) 
( 4 )查看慢查询日志。 
[[email protected] mysql]# more localhost-slow.log 
# Time: 081026 19:46:34 
# [email protected]: root[root] @ localhost [] 
# Query_time: 11 Lock_time: 0 Rows_sent: 1 Rows_examined: 6552961 
select count(*) from t_user; 
从上面日志中,可以发现查询时间超过 5 秒的 SQL ,而小于 5 秒的则没有出现在此日志中。 
如果慢查询日志中记录内容很多,可以使用 mysqldumpslow 工具( MySQL 客户端安装自带)来对慢查询日志进行分类汇总。下例中对日志文件 mysql_master-slow.log 进行了分类汇总,只显示汇总后摘要结果: 
[[email protected]_master mysql_data]# mysqldumpslow mysql_master-slow.log 
Reading mysql slow query log from mysql_master-slow.log 
Count: 2 Time=11.00s (22s) Lock=0.00s (0s) Rows=1.0 (2), root[root]@mysql_master 
select count(N) from t_user; 
对于 SQL 文本完全一致,只是变量不同的语句, mysqldumpslow 将会自动视为同一个语句进行统计,变量值用 N 来代替。这个统计结果将大大增加用户阅读慢查询日志的效率,并迅速定位系统的 SQL 瓶颈。 
注意:慢查询日志对于我们发现应用中有性能问题的 SQL 很有帮助,建议正常情况下,打开此日志并经常查看分析。

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/93470/showart_2001472.html

时间: 2024-10-16 17:24:20

[MySQL优化] -- 如何定位效率较低的SQL的相关文章

MySQL优化:使用慢查询日志定位效率较低的SQL语句

MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启动时,mysqld 会写一个包含所有执行时间超过long_query_time 秒的SQL语句的日志文件,通过查看这个日志文件定位效率较低的SQL . 慢查询日志在查询结束以后才记录,所以在应用反映执行效率出现问题的时候查询慢查询日志并不能定位问题,可以使用show processlist命令查看当前MySQL在进行的线程,包括线程的状态.是否锁表等,可以实时地查看SQ

MySQL优化之COUNT(*)效率

MySQL优化之COUNT(*)效率 刚给一个朋友解决他写的Discuz!插件的问题,说到MySQL的COUNT(*)的效率,发现越说越说不清楚,干脆写下来,分享给大家. COUNT(*)与COUNT(COL)网上搜索了下,发现各种说法都有:比如认为COUNT(COL)比COUNT(*)快的:认为COUNT(*)比COUNT(COL)快的:还有朋友很搞笑的说到这个其实是看人品的. 在不加WHERE限制条件的情况下,COUNT(*)与COUNT(COL)基本可以认为是等价的:但是在有WHERE限制

MySQL优化之COUNT(*)效率(部分转载与个人亲测)

说到MySQL的COUNT(*)的效率,发现越说越说不清楚,干脆写下来,分享给大家. COUNT(*)与COUNT(COL)网上搜索了下,发现各种说法都有:比如认为COUNT(COL)比COUNT(*)快的:认为COUNT(*)比COUNT(COL)快的:还有朋友很搞笑的说到这个其实是看人品的. 在不加WHERE限制条件的情况下,COUNT(*)与COUNT(COL)基本可以认为是等价的:但是在有WHERE限制条件的情况下,COUNT(*)会比COUNT(COL)快非常多: 具体的数据参考如下:

Mysql 定位执行效率低的sql 语句

一.通过MySQL慢查询日志定位执行效率低的SQL语句. MySQL通过慢查询日志定位那些执行效率较低的SQL 语句,用--log-slow-queries[=file_name]选项启动时,mysqld 会写一个包含所有执行时间超过long_query_time 秒的SQL语句的日志文件,通过查看这个日志文件定位效率较低的SQL . 1.通过命令: show variables like '%query%'  查看是否开启慢查询日志. 开启前 开启后 slow_query_log :   on

MySQL优化(四) 慢查询的定位及优化

一.SQL语句优化的一般步骤: (1)通过 show status 命令了解各种 SQL 的执行效率: (2)定位执行效率较低的 SQL 语句(重点是 Select): (3)通过 explain 分析低效率的 SQL 语句的执行情况: (4)确实问题并采取相应的优化措施: 二. 1.show status 命令 格式: show [session | global] status like ... 如果不写[session | global],默认的是session,即取出当前回话的执行情况:

MySQL优化详解

ysql表复制 复制表结构+复制表数据 ? 1 2 mysql> create table t3 like t1; mysql> insert into t3 select * from t1; mysql索引 ? 1 2 3 4 5 6 7 8 9 10 11 12 ALTER TABLE用来创建普通索引.UNIQUE索引或PRIMARY KEY索引 ALTER TABLE table_name ADD INDEX index_name (column_list) ALTER TABLE t

mysql优化技巧

mysql 数据库优化 包括 a.表的设计合理化(符合3NF) b.添加适当索引(index[4种:普通索引 主键索引 唯一索引unique  全文索引]) c.分表技术(水平分割,垂直分割) d.读写[写:update/delete/add]分离 e.存储过程[模块化编程 可以提高速度] 数据库的三层结构 orale MySQL db2 sql server php程序通过dbms(数据库管理系统)操作数据库文件,数据库执行相关操作返回给dbms,然后再返回给PHP dbms 首先编译PHP代

MySql优化的一般步骤:

1.通过show status 命令了解各种sql的执行效率 SHOW STATUS提供msyql服务器的状态信息 一般情况下,我们只需要了解以”Com”开头的指令 show session status like ‘Com%’:显示当前的连接的统计结果 show global status like ‘Com%’ :显示自数据库上次启动至今的统计结果 注:默认是session级别的 其中Com_XXX表示XXX语句所执行的次数.重点注意:Com_select,Com_insert,Com_up

数据库 mysql 优化器原理

MySQL查询优化器有几个目标,但是其中最主要的目标是尽可能地使用索引,并且使用最严格的索引来消除尽可能多的数据行. 你的最终目标是提交SELECT语句查找数据行,而不是排除数据行.优化器试图排除数据行的原因在于它排除数据行的速度越快,那么找到与条件匹配的数据行也就越快. 如何 更好的 利用索引: 1:尽量比较数据类型相同的数据列.当你在比较操作中使用索引数据列的时候,请使用数据类型相同的列.相同的数据类型比不同类型的性能要高一些. 例如,INT与BIGINT是不同的.CHAR(10)被认为是C