使用explain来分析SQL语句实现优化SQL语句
用法: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语句的更多相关文章
- sql语句的优化分析
开门见山,问题所在 sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种情况. 网速不给力,不稳定. 服务器内存不够,或者SQL 被分配的内存不够. sql语句设计不合理 没有相应的索 ...
- 【转】sql语句的优化分析
开门见山,问题所在 sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种情况. 网速不给力,不稳定. 服务器内存不够,或者SQL 被分配的内存不够. sql语句设计不合理 没有相应的索 ...
- 【面试突击】- sql语句的优化分析
开门见山,问题所在 原文地址:http://www.cnblogs.com/knowledgesea/p/3686105.html sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种 ...
- oracle用EXPLAIN PLAN 分析SQL语句
EXPLAIN PLAN 是一个很好的分析SQL语句的工具,它甚至可以在不执行SQL的情况下分析语句. 通过分析,我们就可以知道ORACLE是怎么样连接表,使用什么方式扫描表(索引扫描或全表扫描)以及 ...
- 简述项目中优化sql语句执行效率的方法,从哪些方面,sql语句性能如何分析?
(1)尽量选择较小的列: (2)将where中用的比较频繁的字段建立索引: (3)select中避免使用*: (4)避免在索引列上使用计算.not in和<>等操作: (5)当只需要一行数 ...
- 如何用 SQL Tuning Advisor (STA) 优化SQL语句
在Oracle10g之前,优化SQL是个比较费力的技术活,不停的分析执行计划,加hint,分析统计信息等等.在10g中,Oracle推出了自己的SQL优化辅助工具: SQL优化器(SQL Tuning ...
- [转]一个用户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 ...
- 优化sql语句
关于数据库sql语句的优化? 这个链接可以看 涉及数据库的操作基本都是变得很慢了, 所以通常说数据库是程序的瓶颈 测试/优化数据库/sql的方法: 把order排序.where条件等一个一个去除法来做 ...
- mysql优化SQL语句的一般步骤及常用方法
一.优化SQL语句的一般步骤 1. 通过show status命令了解各种SQL的执行频率 mysqladmin extended-status 或: show [session|global]sta ...
随机推荐
- mybatis源码解析8---执行mapper接口方法到执行mapper.xml的sql的过程
上一篇文章分析到mapper.xml中的sql标签对应的MappedStatement是如何初始化的,而之前也分析了Mapper接口是如何被加载的,那么问题来了,这两个是分别加载的到Configura ...
- PyCharm2017破解步骤
前段时间买了一套python的学习视频,附带一个Pycharm的安装包和注册码,现在注册码被JetBrains封杀了,不得已在网上找了一下破解的教程,在这里记录一下: 先找到破解补丁无需使用注册码,下 ...
- Subversion1.8源码安装流程
为了解决svnamin:Unrecognized record type in stream的问题,决定将Subversion1.7升级为Subversion1.8 Subversion1.8的源码安 ...
- Linux服务器---邮件服务openwebmail配置
配置openwebmail 通过修改配置文件openwebmail.conf,实现个性化邮箱定制.用户可以自由的更改邮箱logo.域名.容量 .签名等信息. 1.重定向index,快速打开邮箱.将下面 ...
- 项目方说性能达到百万TPS,如何测试它的可信度?
项目方说性能达到百万TPS,如何测试它的可信度? 应用系统性能提升的关键在于运维端的接入管理模型(AAA,认证 Authentication.授权 Authorization.计费 Accountin ...
- linux 开始
3306 -- mysql 8000--django默认 服务由端口控制 https -- 443 http -- 80 linux发行版:1.centos 免费版的redhat2.ubuntu 乌版 ...
- printf、fprintf、sprintf和snprintf 区别
都是把格式好的字符串输出,只是输出的目标不一样: 1 printf,是把格式字符串输出到标准输出(一般是屏幕,可以重定向). 2 sprintf,是把格式字符串输出到指定字符串中,所以参数比print ...
- flask框架----flask中的wtforms使用
一.简单介绍flask中的wtforms WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证. 安装: pip3 install wtforms 二.简单使用wtfo ...
- 查看gc的次数
1,查找出程序进程id # 这里输出tomcat的进程id echo `ps -ef|grep tomcat|grep -v 'grep'|awk '{print $2'}` 2,查看gc的次数 js ...
- php 查找字符串里面中文字符第一次出现的位置,并插入字符串
//查找字符串里面中文字符第一次出现的位置,并插入字符串 function find_first_chinese_insert($str,$insert_str){ $count = mb_strle ...