面对业务的迅猛发展,DBA的一项重要工作就是及时发现数据库中的低效SQL语句,有的可以立刻着手解决(比如缺少合适的索引),有的需要尽快反馈给开发人员进行修改。

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语句有可能执行得挺快。

Windows下开启MySQL慢查询

MySQL在Windows系统中的配置文件一般是是my.ini找到[mysqld]下面加上

代码如下 复制代码
log-slow-queries = F:/MySQL/log/mysqlslowquery.log
long_query_time = 2

Linux下启用MySQL慢查询

MySQL在Windows系统中的配置文件一般是是my.cnf找到[mysqld]下面加上

代码如下 复制代码
log-slow-queries=/data/mysqldata/slowquery.log
long_query_time=2

www.111cn.net

注意

log-slow-queries = F:/MySQL/log/mysqlslowquery.log为慢查询日志存放的位置,一般这个目录要有MySQL的运行帐号的可写权限,一般都将这个目录设置为MySQL的数据存放目录;
long_query_time=2中的2表示查询超过两秒才记录;

配置好上述几个参数后,我们就可以监视日志,然后着手进行解决了,如下

通过 EXPLAIN 分析低效 SQL的执行计划:

通过以上步骤查询到效率低的SQL后,我们可以通过explain或者desc 获取MySQL如何执行SELECT语句的信息,包括select语句执行过程表如何连接和连接的次序。
explain可以知道什么时候必须为表加入索引以得到一个使用索引来寻找记录的更快的SELECT。

代码如下 复制代码
mysql> explain select sum(moneys) from sales a,companys b where a.company_id =
b.id and a.year = 2006;
+----------------+ www.111cn.net ----------+-----------+----------------+----------------+---------
-+-----------+----------------+
| select_type| table | type | possible_keys| key| key_len|rows
| Extra|
+----------------+----------+-----------+----------------+----------------+---------
-+-----------+----------------+
| SIMPLE| b| index | PRIMARY| PRIMARY| 4|1 | Using index
|
| SIMPLE| a| ALL| NULL| NULL| NULL |12 | Using where
|
+----------------+----------+-----------+----------------+----------------+---------
-+-----------+----------------+
2 rows in set (0.02 sec)

select_type:select 类型

table:输出结果集的表
type:表示表的连接类型
当表中仅有一行是type的值为system是最佳的连接类型;
当select操作中使用索引进行表连接时type的值为ref;
当select的表连接没有使用索引时,经常会看到type的值为ALL,表示对该表进行了全表扫描,这时需要考虑通过创建索引来提高表连接的效率。
possible_keys: 表示查询时,可以使用的索引列.
key:表示使用的索引
key_len:索引长度
rows:扫描范围
Extra:执行情况的说明和描述
 
确定问题,并采取相应的优化措施:

经过以上步骤,基本可以确认问题出现的原因,可以根据情况采取相应的措施,进行优化提高执行的效率。
例如上面的例子,我们确认是对a表的全表扫描导致效率的不理想,我们对a表的year字段创建了索引,查询需要扫描的行数明显较少。

代码如下 复制代码
mysql> explain select sum(moneys) from sales a,companys b where a.company_id =
b.id and a.year = 2006;
+----------------+----------+-----------+----------------+----------------+---------
-+-----------+----------------+
| select_type| table | type | possible_keys| key| key_len|rows
| Extra|
+----------------+----------+-----------+----------------+----------------+---------
-+-----------+----------------+
| SIMPLE| b| index | PRIMARY| PRIMARY| 4|1 | Using index
|
| SIMPLE| a| ref| year| year| 4|3 |Using
where|
+----------------+----------+-----------+----------------+----------------+---------
-+-----------+----------------+
2 rows in set (0.02 sec)

更多详细内容请查看:http://www.111cn.net/database/mysql/55408.htm

如何找出MySQL数据库中的低效SQL语句相关推荐

  1. mysql 强制使用索引_快速找出MySQL数据库冗余索引和未使用索引

    冗余索引和未使用索引的危害 随着上线的业务越来越多,在MySQL数据库中建的表也会越来越多,为提高查询访问速度,会创建相应的索引.但是由于技术人员的水平参差不齐,业务下线,代码逻辑变更等原因,导致线上 ...

  2. django使用mysql原始语句,Django中使用mysql数据库并使用原生sql语句操作

    Django自身默认使用sqlite3这个轻量级的数据库,但是当我们开发网站时,sqlite3就没有mysql好,sqlite3适合一些手机上开发使用的数据库. 准备的软件 mysql数据库,版本5. ...

  3. mysql数据库中 pri_MySQL数据库管理——SQL指令集

    1.查看数据库列表信息 show databases; 2.进入数据库 use mysql(数据库名mysql): 3.查看数据表 show table info(表名info); 4.显示表结构信息 ...

  4. django mysql sql语句_Django中使用mysql数据库并使用原生sql语句操作

    Django自身默认使用sqlite3这个轻量级的数据库,但是当我们开发网站时,sqlite3就没有mysql好,sqlite3适合一些手机上开发使用的数据库. 准备的软件 mysql数据库,版本5. ...

  5. MySQL数据库:常见经典SQL语句

    一.基础: 1.创建数据库:CREATE DATABASE database-name 2.删除数据库:drop database dbname 3.备份sql server: --- (1)创建备份 ...

  6. MySQL数据库增删改查SQL语句

    查看数据库 show databases; 使用数据库 use 数据库名; 创建数据库 CREATE DATABASE 数据库名; 删除数据库 DROP DATABASE 数据库名; 创建表 crea ...

  7. MySQL数据库学习——啥是SQL语句?

    MYSQL数据库的学习 SQL 1.什么是SQL? Structured Query Language:结构化查询语言其实就是定义了操作所有关系型数据库的规则.每一种数据库操作的方式存在不一样的地方, ...

  8. [CentOS Python系列] 三.阿里云MySQL数据库开启配置及SQL语句基础知识

    从2014年开始,作者主要写了三个Python系列文章,分别是基础知识.网络爬虫和数据分析. Python基础知识系列:Pythonj基础知识学习与提升 Python网络爬虫系列:Python爬虫之S ...

  9. Mysql数据库中的 Group by 语句的特殊之处(select 中的项目不必出现在Group by中)---不建议使用!

    ■以前的认知 (基本知识,完全正确) ・使用GROUP BY 语句时,SELECT中的项目,必须在GROUP BY 中出现 SELECTa, b, cFROMtable1GROUP BYa, b, c ...

最新文章

  1. IMX6的相关音频结构体的定义
  2. 轮播图js怎么设置图片自适应大小
  3. 【PAT乙级】1039 到底买不买 (20 分)
  4. 叮叮叮 重点之中的python必备英语单词(2)来啦!请记得查收
  5. CentOS7 修改静态IP
  6. Android GPS开发总结
  7. 《Java 面经手册》PDF,全书5章29节,417页11.5万字,完稿发版!
  8. 硬件知识储备01_一文看懂W25Qxx系列芯片(W25Q16、W25Q32、W25Q64...)
  9. Changer常用的软件
  10. 学校教材管理系统html,学校教材管理系统
  11. Failed to obtain JDBC Connection; nested exception is java.sql.SQLException: Connections could not b
  12. Unity3D游戏引擎最详尽基础教程
  13. 强烈推荐一款好用的API接口
  14. Hash散列算法详细解析(六)
  15. 修改设备管理器信息,修改我的电脑系统属性,修改dxdiag信息
  16. Mosquitto安装配置和使用指南
  17. stick棍子by Ye
  18. java中jar包怎么下载
  19. matlab卡农,又用Mathematica写了一段卡农
  20. vue-quill-editor 富文本编辑器 自定义上传图片

热门文章

  1. 关于游戏排行榜设计开发的一些总结
  2. Redis:02---安装Redis(Linux+Windows+Docker)
  3. 为革命,保护视力——为Eclipse更换暗黑皮肤及编辑页面的字体颜色主题
  4. C++ 序列化和反序列化学习
  5. java 输出三位数和n位数的每一位的数
  6. 数学建模4 论文写作排版和技巧
  7. 2000年考研英语阅读理解文章二
  8. 一个穷人是从什么时候开始有钱的?
  9. 专访谷歌CEO:像对待家人一样对待员工
  10. oracle thin和oci 区别