用法:explain sql

作用:用于分析sql语句

mysql> explain select * from quser_1 where loginemail = "quctest2124@163.com";
+----+-------------+---------+------+-----------------+-----------------+---------+-------+------+-----------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+-----------------+-----------------+---------+-------+------+-----------------------+
| 1 | SIMPLE | quser_1 | ref | loginemailindex | loginemailindex | 302 | const | 1 | Using index condition |
+----+-------------+---------+------+-----------------+-----------------+---------+-------+------+-----------------------+
1 row in set mysql>

  

0: id表示执 explain 的一个编号(没有实际意义)

1:table 查询的表名

2:select_type查询类型,是单表查询、联合查询还是子查询,可能会出现以下值:

查询类型 说明
SIMPLE 简单的 select 查询,不使用 union 以及子查询
PRIMARY 最外层的 select 查询(使用到主键作为查询条件)
UNION UNION UNION 中的第二个或者随后的 select 查询,不依赖于外部查询的结果集
DEPENDENT UNION UNION 中的第二个或者随后的 select 查询,依赖于外部查询的结果集
SUBQUERY 子查询中的第一个 select 查询,不依赖于外部查询的结果集
DEPENDENT SUBQUERY 子查询中的第一个 select 查询,依赖于外部 查询的结果集
DERIVED 用于 from 子句里有子查询的情况。 MySQL 会 递归执行这些子查询, 把结果放在临时表里
UNCACHEABLE SUBQUERY 结果集不能被缓存的子查询,必须重新为外 层查询的每一行进行评估
UNCACHEABLE UNION UNION UNION中的第二个或随后的 select 查询,属 于不可缓存的子查询

例如使用如下表结构:

CREATE TABLE `quser_1` (
`quserid` int(10) unsigned NOT NULL DEFAULT '0',
`username` varchar(64) NOT NULL DEFAULT '',
`id` int(10) unsigned NOT NULL DEFAULT '0',
`ver` int(10) unsigned NOT NULL DEFAULT '0',
`password` varchar(40) NOT NULL DEFAULT '',
`randomkey` varchar(30) NOT NULL DEFAULT '',
`sealtime` varchar(30) NOT NULL DEFAULT '',
`status` tinyint(1) NOT NULL DEFAULT '0',
`src` varchar(50) NOT NULL DEFAULT '',
`ip` varchar(11) NOT NULL DEFAULT '0',
`regtime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`tastetime` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
`lastmodifytime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`loginemail` varchar(100) NOT NULL DEFAULT '',
`loginmethod` tinyint(3) unsigned NOT NULL DEFAULT '0',
`va` varchar(1000) NOT NULL DEFAULT '' COMMENT 'virtual account info',
PRIMARY KEY (`quserid`) KEY_BLOCK_SIZE=1024,
UNIQUE KEY `username` (`username`) KEY_BLOCK_SIZE=1024,
KEY `id` (`id`) KEY_BLOCK_SIZE=1024,
KEY `loginemailindex` (`loginemail`) KEY_BLOCK_SIZE=2048
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE=8

  

示例1:使用简单查询

mysql> explain select * from quser_1 where loginemail = "quctest2124@163.com";
+----+-------------+---------+------+-----------------+-----------------+---------+-------+------+-----------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+-----------------+-----------------+---------+-------+------+-----------------------+
| 1 | SIMPLE | quser_1 | ref | loginemailindex | loginemailindex | 302 | const | 1 | Using index condition |
+----+-------------+---------+------+-----------------+-----------------+---------+-------+------+-----------------------+
1 row in set mysql>

  

type 说明:

type 说明
system 表仅有一行(=系统表)。这是 const 连接类型的一个特例
const const 用于用常数值比较 PRIMARY KEY 时。当 查询的表仅有一行时,使用 System
eq_ref const 用于用常数值比较 PRIMARY KEY 时。当 查询的表仅有一行时,使用 System
ref 连接不能基于关键字选择单个行,可能查找 到多个符合条件的行。 叫做 ref 是因为索引要 跟某个参考值相比较。这个参考值或者是一 个常数,或者是来自一个表里的多表查询的 结果值
ref_or_null 如同 ref, 但是 MySQL 必须在初次查找的结果 里找出 null 条目,然后进行二次查找
index_merge 说明索引合并优化被使用了
unique_subquery 在某些 IN 查询中使用此种类型,而不是常规的 ref:value IN (SELECT primary_key FROM single_table WHERE some_expr)
index_subquery 在 某 些 IN 查 询 中 使 用 此 种 类 型 , 与 unique_subquery 类似,但是查询的是非唯一 性索引: value IN (SELECT key_column FROM single_table WHERE some_expr)
range 只检索给定范围的行,使用一个索引来选择 行。key 列显示使用了哪个索引。当使用=、 <>、>、>=、<、<=、IS NULL、<=>、BETWEEN 或者 IN 操作符,用常量比较关键字列时,可 以使用 range
index 全表扫描,只是扫描表的时候按照索引次序 进行而不是行。主要优点就是避免了排序, 但是开销仍然非常大
all 最坏的情况,从头到尾全表扫描

示例2:type 为 const

mysql> explain select * from quser_1 where quserid = "3000096101";
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------+
| 1 | SIMPLE | quser_1 | const | PRIMARY | PRIMARY | 4 | const | 1 | NULL |
+----+-------------+---------+-------+---------------+---------+---------+-------+------+-------+
1 row in set

  

示例3: type 为 all (这种是要优化和避免的)

mysql> explain select * from quser_1 where src = "pcw";
+----+-------------+---------+------+---------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+---------------+------+---------+------+------+-------------+
| 1 | SIMPLE | quser_1 | ALL | NULL | NULL | NULL | NULL | 1274 | Using where |
+----+-------------+---------+------+---------------+------+---------+------+------+-------------+
1 row in set

  

示例4: type  为 ref

mysql> explain select * from quser_1 where loginemail = '11223344@qq.com';
+----+-------------+---------+------+-----------------+-----------------+---------+-------+------+-----------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+-----------------+-----------------+---------+-------+------+-----------------------+
| 1 | SIMPLE | quser_1 | ref | loginemailindex | loginemailindex | 302 | const | 1 | Using index condition |
+----+-------------+---------+------+-----------------+-----------------+---------+-------+------+-----------------------+
1 row in set

  

prossible_keys:能在该表中使用哪些索引有助于查询

key:实际使用的索引

key_len:索引的长度,在不损失精确性的情况 下,长度越短越好

ref:索引的哪一列被使用了

rows:返回的结果的行数

Extra:其他说明

使用explain来分析SQL语句实现优化SQL语句的更多相关文章

  1. sql语句的优化分析

    开门见山,问题所在 sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种情况. 网速不给力,不稳定. 服务器内存不够,或者SQL 被分配的内存不够. sql语句设计不合理 没有相应的索 ...

  2. 【转】sql语句的优化分析

    开门见山,问题所在 sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种情况. 网速不给力,不稳定. 服务器内存不够,或者SQL 被分配的内存不够. sql语句设计不合理 没有相应的索 ...

  3. 【面试突击】- sql语句的优化分析

    开门见山,问题所在 原文地址:http://www.cnblogs.com/knowledgesea/p/3686105.html sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种 ...

  4. oracle用EXPLAIN PLAN 分析SQL语句

    EXPLAIN PLAN 是一个很好的分析SQL语句的工具,它甚至可以在不执行SQL的情况下分析语句. 通过分析,我们就可以知道ORACLE是怎么样连接表,使用什么方式扫描表(索引扫描或全表扫描)以及 ...

  5. 简述项目中优化sql语句执行效率的方法,从哪些方面,sql语句性能如何分析?

    (1)尽量选择较小的列: (2)将where中用的比较频繁的字段建立索引: (3)select中避免使用*: (4)避免在索引列上使用计算.not in和<>等操作: (5)当只需要一行数 ...

  6. 如何用 SQL Tuning Advisor (STA) 优化SQL语句

    在Oracle10g之前,优化SQL是个比较费力的技术活,不停的分析执行计划,加hint,分析统计信息等等.在10g中,Oracle推出了自己的SQL优化辅助工具: SQL优化器(SQL Tuning ...

  7. [转]一个用户SQL慢查询分析,原因及优化

    来源:http://blog.rds.aliyun.com/2014/05/23/%E4%B8%80%E4%B8%AA%E7%94%A8%E6%88%B7sql%E6%85%A2%E6%9F%A5%E ...

  8. 优化sql语句

    关于数据库sql语句的优化? 这个链接可以看 涉及数据库的操作基本都是变得很慢了, 所以通常说数据库是程序的瓶颈 测试/优化数据库/sql的方法: 把order排序.where条件等一个一个去除法来做 ...

  9. mysql优化SQL语句的一般步骤及常用方法

    一.优化SQL语句的一般步骤 1. 通过show status命令了解各种SQL的执行频率 mysqladmin extended-status 或: show [session|global]sta ...

随机推荐

  1. Axure RP Extension for Chrome修复

    Axure RP Extension for Chrome安装之前一直用 Firefox 浏览器浏览原型文件,一直用不惯,而且用 Firefox 的唯一目的就是看原型.其他都是用 Chrome 浏览器 ...

  2. linux dns

    linux 用户相关的 root   相当于QQ群主 sudo  QQ群管理员 普通用户  QQ群水军 root  UID 是 0   组UID也是0  普通用户UID从1000开始 查看用户id 信 ...

  3. js获取浏览器信息

    function message() { txt = "<p>浏览器代码名: " + navigator.appCodeName + "</p>& ...

  4. java-工厂方法模式学习笔记

    1.工厂模式分三种 1.1 普通工厂模式:就是建立一个工厂类,对实现了同一接口的一些类进行实例创建,如下图所示: 就以老司机开车(土豪开奔驰,宝马:屌丝骑自行车)为例,说明一下普通工厂模式: 首先,创 ...

  5. The Little Prince-summary

    The Little Prince-summary 这些年 ”寂寞”这个词使用频率越来越高 这些年 不管有钱没钱 有对象没对象的人 入夜时分总是心里空空 不知生活的意义是什么 我们不喜欢一座城市 对一 ...

  6. Python进阶【第十篇】模块(上)

    ·一.模块 模块就是一组功能的集合体,我们的程序可以导入模块来复用模块里的功能.为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这 ...

  7. MyEclipse 10.7(版本:eclipse 3.7.x-Indigo系列)安装PyDev 4.5.4插件

    解压安装路径结构如截图所示: 安装后重启:

  8. Modbus库开发笔记之十一:关于Modbus协议栈开发的说明(转)

    源: Modbus库开发笔记之十一:关于Modbus协议栈开发的说明

  9. 腾讯云 网站开启HTTPS

    下图是我站点的初始化样子,可以看到只是输出一个字符串,啥也没有,并且没有https. 这无所谓,因为我们的重点是https,而不是网站内容 接下来就是配置https的关键步骤了,其实只需要三步而已: ...

  10. PyCharm 安装及破解方法

    PyCharm 安装及破解方法 一.安装 首先要下载Pycharm这个软件,可以在官网下载进行下载. 下载完软件之后,双击安装文件即可进行安装,双击后出现下图所示的提示,点击Next即可. 然后会出现 ...