高性能mysql-----MySQL_explain关键字分析查询语句(一)
转载地址:https://www.cnblogs.com/xpp142857/p/7373005.html
MySQL_explain关键字分析查询语句
通过对查询语句的分析,可以了解查询语句的执行情况。MySQL中,可以使用EXPLAIN语句和DESCRIBE语句来分析查询语句。
EXPLAIN语句的基本语法如下:(DESCRIBE语法一致,DESCRIBE可简写为DESC)
EXPLAIN Select 语句;
eg:explain SELECT * FROM `user` where name = 'name6'; 结果如下:

explain结果值及其含义:
|
参数值 |
含义 |
|
id |
表示SELECT语句的编号; |
|
select_type |
表示SELECT语句的类型。 该参数有几个常用的取值: SIMPLE :表示简单查询,其中不包括连接查询和子查询; PRIMARY:表示主查询,或者是最外层的查询语句; UNION :表示连接查询的第二个或后面的查询语句; |
|
table |
表示查询的表; |
|
type |
表示表的连接类型。该参数有几个常用的取值: const :表示表中有多条记录,但只从表中查询一条记录; eq_ref :表示多表连接时,后面的表使用了UNIQUE或者PRIMARY KEY; ref :表示多表查询时,后面的表使用了普通索引; unique_ subquery:表示子查询中使用了UNIQUE或者PRIMARY KEY; index_ subquery:表示子查询中使用了普通索引; range :表示查询语句中给出了查询范围; index :表示对表中的索引进行了完整的扫描; all :表示此次查询进行了全表扫描; ----------- 该条SQL需要优化; |
|
possible_keys |
表示查询中可能使用的索引; 如果备选的数量大于3那说明已经太多了,因为太多会导致选择索引而损耗性能, 所以建表时字段最好精简,同时也要建立联合索引,避免无效的单列索引; |
|
key |
表示查询使用到的索引; |
|
key_len |
表示索引字段的一长度; |
|
ref |
表示使用哪个列或常数与索引一起来查询记录; |
|
rows |
表示查询的行数; 试图分析所有存在于累计结果集中的行数,虽然只是一个估值,却也足以反映 出SQL执行所需要扫描的行数,因此这个值越小越好; |
|
Extra |
表示查询过程的附件信息。 |
通过explain可以得到如下结论:
①使用索引比未使用索引,扫描的行数更少查询速度更快;
②在查询语句中使用LIKE关键字进行查询时,如果匹配字符串的第一个字符为“%”时,索引不会被使用。如果“%”不是在第一个位置,索引就会被使用。
③使用多列索引时,只有查询条件中使用了该索引中的第一个索引字段时,索引才会被使用。
注:create index index_age_sex on user(age,sex); age为第一个索引;
④查询语句只有OR关键字时,如果OR前后的两个条件列都是索引时,查询中将使用索引。只要OR前后有一个条件的列不是索引,那么查询中将不使用索引。
注: 1:where 语句里面如果带有or条件, myisam表能用到索引,innodb不行;2:必须所有的or条件都必须是独立索引;
⑤经过普通运算或函数运算后的索引字段不能使用索引。
但是,经过函数运算字段的字段要使用可以使用函数索引,这种需求建议与DBA沟通。
以上结论来自如下测试:
|
user表: 独立索引:id、name 联合索引:age && sex |
user_noindex表: 无任何索引列; |
|
CREATE TABLE `user` ( `id` int(11) NOT NULL, `name` varchar(30) NOT NULL, `age` int(11) NOT NULL, `sex` tinyint(4) NOT NULL, `isDeleted` tinyint(4) NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `id_unidx` (`id`) USING BTREE, UNIQUE KEY `name_unidx` (`name`) USING BTREE, KEY `index_age_sex` (`age`,`sex`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1; |
CREATE TABLE `user_noindex` ( `id` int(11) NOT NULL, `name` varchar(30) NOT NULL, `age` int(11) DEFAULT NULL, `sex` tinyint(4) DEFAULT NULL, `isDeleted` tinyint(4) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8; |
【1】索引对查询的影响-----加索引和不加索引的对比-----使用索引扫描的更少查询更快
语句1:explain SELECT * FROM `user` where name = 'name6';
语句2:explain SELECT * FROM `user_noindex` where name = 'name6';
| 结果集 | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 语句1 | 1 | SIMPLE | user | const | name_unidx | name_unidx | 32 | const | 1 | null |
| 语句2 | 1 | SIMPLE | user_noindex | ALL | null | null | null | null | 10 | Using where |
【2】索引对查询的影响-----加索引----使用和未使用索引的对比-----在查询语句中使用LIKE关键字进行查询时,如果匹配字符串的第一个字符为“%”时,索引不会被使用。如果“%”不是在第一个位置,索引就会被使用。
语句1:explain SELECT * FROM `user` where name like '%name6';
语句2:explain SELECT * FROM `user` where name like '%name6%';
语句3:explain SELECT * FROM `user` where name like 'name6%';
| 结果集 | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 语句1 | 1 | SIMPLE | user | ALL | null | null | null | null | 10 | Using where |
| 语句2 | 1 | SIMPLE | user | ALL | null | null | null | null | 10 | Using where |
| 语句3 | 1 | SIMPLE | user | range | name_unidx | name_unidx | 32 | const | 1 | null |
【3】索引对查询的影响-----加索引----使用和未使用索引的对比-----多列索引是在表的多个字段创建一个索引。只有查询条件中使用了这个字段中的第一个字段时,索引才会被使用。
语句1:explain SELECT * FROM `user` where age = '19';
语句2:explain SELECT * FROM `user` where sex = '1';
语句3:explain SELECT * FROM `user` where sex = '1' and age = '19';
| 结果集 | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 语句1 | 1 | SIMPLE | user | ref | index_age_sex | index_age_sex | 4 | const | 1 | null |
| 语句2 | 1 | SIMPLE | user | ALL | null | null | null | null | 10 | Using where |
| 语句3 | 1 | SIMPLE | user | ref | index_age_sex | index_age_sex | 5 | const,const | 1 | null |
【4】索引对查询的影响-----加索引----使用和未使用索引的对比-----查询语句只有OR关键字时,如果OR前后的两个条件的列都是索引时,查询中将使用索引。如果OR前后有一个条件的列不是索引,那么查询中将不使用索引。
语句1:explain SELECT * FROM `user` where (age = '19' OR isDeleted = '0');
语句2:explain SELECT * FROM `user` where (sex = '1' OR age = '19'); -- 联合索引
语句3:explain SELECT * FROM `user` where (name = 'name1' OR id = '1'); -- 独立索引
-- alter table user engine = innodb;
| 结果集 | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 语句1 | 1 | SIMPLE | user | ALL | index_age_sex | null | null | null | 10 | Using where |
| 语句2 | 1 | SIMPLE | user | ALL | index_age_sex | null | null | null | 10 | Using where |
| 语句3 | 1 | SIMPLE | user | ref | PRIMARY,id_unidx,name_unidx | index_age_sex | null | null | 10 | Using where |
-- alter table user engine = myisam;
| 结果集 | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
| 语句1 | 1 | SIMPLE | user | ALL | index_age_sex | null | null | null | 10 | Using where |
| 语句2 | 1 | SIMPLE | user | ALL | index_age_sex | null | null | null | 10 | Using where |
| 语句3 | 1 | SIMPLE | user | index_merge | PRIMARY, id_unidx, name_unidx |
name_unidx, PRIMARY |
32,4 | null | 2 | Using union (name_unidx,PRIMARY); Using where |
很多查询中需要使用子查询。子查询可以使查询语句很灵活,但子查询的执行效率不高。子查询时,MySQL需要为内层查询语句的查询结果建立一个临时表。然后外层查询语句在临时表中查询记录。查询完毕后,MySQL需要撤销这些临时表。因此,子查询的速度会受到一定的影响。如果查询的数据量比较大,这种影响就会随之增大。在MySQL中可以使用连接查询来替代子查询。连接查询不需要建立临时表,其速度比子查询要快。
高性能mysql-----MySQL_explain关键字分析查询语句(一)的更多相关文章
- MySQL_explain关键字分析查询语句
版权声明:本文为博主原创文章,转载请注明出处. 通过对查询语句的分析,可以了解查询语句的执行情况.MySQL中,可以使用EXPLAIN语句和DESCRIBE语句来分析查询语句. EXPLAIN语句的基 ...
- 高性能MySql进化论(十一):常见查询语句的优化
总结一下常见查询语句的优化方式 1 COUNT 1. COUNT的作用 · COUNT(table.filed)统计的该字段非空值的记录行数 · ...
- MySQL中如何分析查询语句
Oracle中有explain for,mysql中也有同样的功能,那便是explain,举例如下: mysql> explain select (case (select count(*) f ...
- mysql怎么限制某些查询语句的执行?
mysql怎么限制某些查询语句的执行? 比如某些sql语句执行时间很长,超过10s,怎么样超过10s就不让其执行? 后续更新中...
- mysql 存储过程:提供查询语句并返回查询执行影响的行数
mysql 存储过程:提供查询语句并返回查询执行影响的行数DELIMITER $$ DROP PROCEDURE IF EXISTS `p_get_select_row_number`$$ CREAT ...
- MySQL基础架构之查询语句执行流程
这篇笔记主要记录mysql的基础架构,一条查询语句是如何执行的. 比如,在我们从student表中查询一个id=2的信息 select * from student where id=2; 在解释这条 ...
- MySql 使用explain分析查询
今天写了个慢到哭的查询,想用explain分析下执行计划,后来发现explain也是有局限性的: EXPLAIN不会告诉你关于触发器.存储过程的信息或用户自定义函数对查询的影响情况 •EXPLAIN不 ...
- Explain分析查询语句
表的读取顺序 读取操作的类型 可用索引,实际使用的索引 表之间的引用 每张表多少行被优化器查询 索引的长度 EXPLAIN字段解释: ØTable:显示这一行的数据是关于哪张表的 Øpossible ...
- 高性能mysql 第6章 查询性能优化
查询缓存: 在解析一个sql之前,如果查询缓存是打开的,mysql会去检查这个查询(根据sql的hash作为key)是否存在缓存中,如果命中的话,那么这个sql将会在解析,生成执行计划之前返回结果. ...
随机推荐
- codevs1001 舒适的路线 - 贪心 - 并查集
题目描述 Description Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光.Z小镇附近共有N(1<N≤500)个景点(编号为1,2,3,…,N),这些景点被M(0<M≤ ...
- C++使用Socket 邮箱登录服务器验证
转载:http://blog.csdn.net/zengraoli/article/details/36866241 转载:http://blog.csdn.net/alger_magic/artic ...
- JavaScript:正则表达式 分组2
继续上一篇的写,这篇复杂点. 分组+范围 var reg=/([abcd]bc)/g; var str="abcd bbcd cbcd dbcd"; console.log(str ...
- BZOJ5168: [HAOI2014]贴海报 线段树
Description Bytetown城市要进行市长竞选,所有的选民可以畅所欲言地对竞选市长的候选人发表言论.为了统一管理,城市委 员 会为选民准备了一个张贴海报的electoral墙.张贴规则如下 ...
- 论文笔记之:End-to-End Localization and Ranking for Relative Attributes
End-to-End Localization and Ranking for Relative Attributes arXiv Paper 摘要:本文提出一种 end-to-end 的属性识别方 ...
- JavaScript紧凑学习
JavaScript紧凑学习 windows本地,调用命令行: win键+R 键入cmd , (cmd是Command 命令行 简称) 目录是C盘下的 C:\Users\Administrator&g ...
- 【TCP/IP详解 卷一:协议】第二十三章 TCP的保活定时器
本章介绍保活定时器. 在 TCP 的三握四挥 章节中,我们介绍了 处在 TIME_WAIT 的 2MSL定时器:在 TCP的超时与重传 章节中,我们介绍了 重传定时器:在上一章节中,我们介绍了 防止死 ...
- NRF24L01 射频收发 使用方法
在干啥 这两天在调nrf24l01,最终还是参考正点原子的例程才调通,看芯片手册太难了 还要说啥废话 废话说到这,接下来上代码 SPI协议 spi.c #include "spi.h&quo ...
- kaggle CTR预估
参考涛哥之前做过的CTR预估project,学习下CTR预估的相关知识:http://blog.csdn.net/hero_fantao/article/category/6877765 目标:本周末 ...
- POJ 1953 World Cup Noise(递推)
https://vjudge.net/problem/POJ-1953 题意:输入一个n,这n位数只由0和1组成,并且不能两个1相邻.计算共有多少种排列方法. 思路:递推题. 首先a[1]=2,a[2 ...