使用MySQL中的EXPLAIN解释命令来检查SQL
我们看到许多客户的系统因为SQL及数据库设计的很差所以导致许多性能上的问题,这些问题不好解决,但是可以采用一套简单的策略来检查生产系统,发现并纠正一些共性问题。
很显然,您应该尽最大努力设计出最好的数据库,使其有很好的索引并在应用程序中采用高质量的SQL查询语句。但是,在很多时候,现实与设计还是有很大的差异,这是因为网络应用程序开发速度快,再加上更新速度也很快,所以,数据库所连接的进程数也经常发生变化。
不幸的是,现在服务器运行速度很快,这些问题不容易察觉,只有当系统投入运行一段时间,随着用户和数据的增加,才发现问题。表中若只有10,000行的时候,任何系统都能运行的很好,但是,当表中有数百万行而SQL又很差的时候,系统就会出现问题。随着并发用户数量增多,会发出更多的并发查询,而这些查询要阅读数百万行。
接下来发生的事就不尽人意了,因为服务器会运行的很慢,像蜗牛在爬,而每个查询要花好几秒的时间才能完成任务,这样毫不费力就能使网站垮掉。这就是所谓的“瓶颈”,指的是系统一直运行的很好,但突然有一天跨了。现今,有很多系统都会出现这样的问题。
要找出问题所在并不容易,但是可以运用一些好的工具来帮忙查找问题。首先,最管用的工具就是slow log,可是,标准工具(mysqldumpslow)不会给出最重要的统计数据 – 已检查的行数。要监控系统性能,这些所谓的重要的服务器统计数据根本就算不上是好数据。请注意,还有其它的好工具,如Percona的 pt-query-profiler就很管用。
当你发现SQL遇到问题,检查出有很多行的时候,你可以在这些SQL查询中,运行EXPLAIN EXTENDED命令。尽管该命令输出的内容比较复杂、难以理解,但是,你可以通过网络资源或像Percona这些工具的帮助,就可以理解命令内容。
但是,如果是一些像我们所看到的简单查询的话(只有单个查询,不含子查询,这些查询由于临时表的存在可能会有很多行/表及联接)输出结果还是容易解释的。
检查EXPLAIN EXTENDED的输出内容(EXTENDED是比较重要的命令,因为该命令可展示许多额外信息),我们会发现很多关键信息:Type这一列很重要,如果输出结果是All或索引,它将会要求扫描所有的表或索引。
Keys这一列也很重要,因为它告诉你使用了哪个索引,如果此处为空,表示未使用任何索引,绝大多数情况下,您需解决此问题。
Rows这一列告知您数据库即将要阅读的行数,当然,越少越好。从理论上来讲,这些未阅读的行数经阅读之后,会被记录到日志中成为已检查的行数,但是实际将要阅读的行数和EXPLAIN系统所记载的将要阅读的行数可能会有差异,这是因为EXPLAIN系统的行数只是预估的行数。请注意此处不包括LIMIT,但是LIMIT不会使要阅读的行数减少,尤其是查询中有排序要求的时候,更不会减少要阅读的行数。
通过借助在线资源及一些工具,您可更好地理解输出的结果。您将发现哪些SQL执行的比较慢及根源是什么,在此,您可以更改SQL、更改索引甚至是更改数据库设计以便提高系统性能。
(Authored by Steve Mushero / ChinaNetCloud CEO & CTO 本博客英文原文请点此查看)
使用MySQL中的EXPLAIN解释命令来检查SQL的更多相关文章
- MySQL中EXPLAIN解释命令详解
MySQL中的explain命令显示了mysql如何使用索引来处理select语句以及连接表.explain显示的信息可以帮助选择更好的索引和写出更优化的查询语句. 1.EXPLAIN的使用方法:在s ...
- MySQL中EXPLAIN解释命令 查看索引是否生效
explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 使用方法,在select语句前加上explain就可以了: 如: expla ...
- MySQL中使用SHOW PROFILE命令分析性能的用法整理(配合explain效果更好,可以作为优化周期性检查)
这篇文章主要介绍了MySQL中使用show profile命令分析性能的用法整理,show profiles是数据库性能优化的常用命令,需要的朋友可以参考下 show profile是由Jerem ...
- Mysql 中完善的帮助命令
Mysql 中完善的帮助命令 Mysql 中的帮助系统很完善,很多操作都可以通过命令行直接获得帮助,如下示例: Mysql 命令行帮助 [root@mysql1 mydata1]# mysql -S ...
- 详解MySQL中EXPLAIN解释命令
Explain 结果解读与实践 基于 MySQL 5.0.67 ,存储引擎 MyISAM . 注:单独一行的"%%"及"`"表示分隔内容,就象分开“第一 ...
- 详解 MySQL 中的 explain
来源:persister 链接:http://www.blogjava.net/persister/archive/2008/10/27/236813.html 在 explain的帮助下,您就知道什 ...
- MySQL中的binlog相关命令和恢复技巧
操作命令: 复制代码 代码如下: show binlog events in 'mysql-bin.000016' limit 10; reset master 删除所有的二进制日志 flush lo ...
- mysql中删除完全重复数据的准确SQL语句
删除数据库中重复的记录,只保留一条 DELETE FROM tb_gps_records WHERE id NOT IN (SELECT bid FROM (SELECT min(id) as bid ...
- MySQL中binlog参数:binlog_rows_query_log_events-记录具体的SQL【转】
在使用RBR也就是行格式的时候,去解析binlog,需要逆向才能分析出对应的原始SQL是什么,而且,里面对应的是每一条具体行变更的内容.当然,你可以开启general log,但如果我们需要的只是记录 ...
随机推荐
- 在Android中使用并发来提高速度和性能
Android框架提供了很实用的异步处理类.然而它们中的大多数在一个单一的后台线程中排队.当你需要多个线程时你是怎么做的? 众所周知,UI更新发生在UI线程(也称为主线程).在主线程中的任何操作都会阻 ...
- 0bjective-c 之 NSString 使用详解
查找资料的时候发现不错的文章,自己翻译之后分享给大家! 一个基本的该类型字符串例子: @"This is a constant character string object"; ...
- JSTL获取list的大小,jstl获取list 的长度,EL表达式获取list的长度,EL表达式获取list大小
在jsp页面中不能通过${list.size}取列表长度,而是 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" pref ...
- hdu 5444 Elven Postman(根据先序遍历和中序遍历求后序遍历)2015 ACM/ICPC Asia Regional Changchun Online
很坑的一道题,读了半天才读懂题,手忙脚乱的写完(套上模板+修改模板),然后RE到死…… 题意: 题面上告诉了我们这是一棵二叉树,然后告诉了我们它的先序遍历,然后,没了……没了! 反复读题,终于在偶然间 ...
- 独立开发游戏越来越容易:Unity 发布旗下的最新游戏引擎 Unity 5,依然有免费版(转)
独立开发者开发游戏正变得越来越容易,因为在游戏设计中很多吃力不讨好的工作可以直接采用像 Epic Games 或 Unity Technologies 这样的游戏引擎来解决.而这几天,游戏引擎商们先后 ...
- Android应用解决65K方法数限制
近日,Android Developers在Google+上宣布了新的Multidex支持库,为方法总数超过65K的Android应用提供了官方支持. 如果你是一名幸运的Android应用开发者,正在 ...
- Chapter13:拷贝控制
拷贝控制操作:拷贝构造函数.拷贝赋值运算符.移动构造函数.移动赋值运算符.析构函数. 实现拷贝控制操作的最困难的地方是首先认识到什么时候需要定义这些操作. 拷贝构造函数: 如果一个构造函数的第一个参数 ...
- F#相关图书推荐
C#与F#编程实践 作 者 [捷] Tomas Petricek,[英] Jon Skeet 著:贾洪峰 译 出 版 社 清华大学出版社 出版时间 2011-10-01 版 次 1 ...
- Emmet使用手册
语法: 1.后代:> 缩写:nav>ul>li < nav> < ul> < li></ li > ...
- ShellExecute的各种用法
一.利用系统默认的邮件收发器发送电子邮件 Uses ..., ShellAPI; Var lpHwnd: HWND; lpOperation, lpFile, lpParameters, lpDire ...