使用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 ...
随机推荐
- 配置开发环境2——eclipse配置
纯手动配置eclipse, Eclipse配置 配置工作空间的编码方式 General—Workspace:改成Other:UTF-8 配置property的编码方式 配置maven Window — ...
- Docker相关知识整理
一.进入和退出docker容器 使用docker ps查看容器id docker exec -it containerId /bin/bash //进入容器 Ctrl + P + Q //退出容器 二 ...
- doc&Alt+/ 快捷键设置&ThreadLocal Fameset与Frame区别
Alt+/不管用原因:新版本中MyEclipse的Alt+/是别的快捷键,Ctrl+Space是提示标签快捷键,而Ctrl+Space与输入法切换冲突不能用.MyEclipse设置Alt+/快捷键 1 ...
- CATALINA_OPTS和 JAVA_OPTS区别
在Tomcat的catalina.sh文件中的启停server脚本中都应用到了两个变量: CATALINA_OPTS和JAVA_OPTS.用于保存Tomcat运行所需的各种参数. 他们在文件中的注释如 ...
- Tomcat配置Manager管理员
修改文件: D:\MyDev\Tomcat\apache-tomcat-7.0.68\conf\tomcat-users.xml 配置内容: <role rolename="mana ...
- C Language Deep Analyse
1.记录几个少见的关键字 auto 声明为自动变量,缺省时编译器一般默认为auto register 声明寄存器变量 volatile 说明变量在程序执行中可被隐含地改变 ex ...
- 【js】关于闭包和匿名函数
关于js闭包.之前我一直以为是匿名函数,以为封闭式的创建即执行销毁就是闭包,其实这是匿名函数,不一样的.也没有闭包的使用经验. 后来去网上查了下才知道,闭包的意思是:函数内部还有函数,返回一个函数,内 ...
- 基于STM32F4移植W5500官方驱动库ioLibrary_Driver(转)
源: 基于STM32F4移植W5500官方驱动库ioLibrary_Driver 参考: 基于STM32+W5500 的Ethernet和Internet移植 Upgrade W5500 Throug ...
- self: 限制并发量asyncio
#coding:utf-8 import time,asyncio a=time.time() id=1 async def hello(id,semaphore): async with semap ...
- redis 数据统计(用自增id防止同一秒并发过大没统计成功)
Redis 缓存保存某段时间累加的数值,加入最大id防止同一秒并发过大,导致只统计了执行时同一秒的部分数据,而同一秒另一部分数据在下次累加时没有统计到缓存中 //coin总数 public funct ...