版权声明:本文为博主原创文章,转载请注明出处。


  通过对查询语句的分析,可以了解查询语句的执行情况。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_explain关键字分析查询语句的更多相关文章

  1. 高性能mysql-----MySQL_explain关键字分析查询语句(一)

    转载地址:https://www.cnblogs.com/xpp142857/p/7373005.html   MySQL_explain关键字分析查询语句 通过对查询语句的分析,可以了解查询语句的执 ...

  2. Explain分析查询语句

    ​表的读取顺序 读取操作的类型 可用索引,实际使用的索引 表之间的引用 每张表多少行被优化器查询 索引的长度 EXPLAIN字段解释: ØTable:显示这一行的数据是关于哪张表的 Øpossible ...

  3. linux下开启mysql慢查询,分析查询语句

    一,为什么要开启这个查询呢? 数据库是很容易产生瓶颈的地方,现在Nosql大家讨论这么热,估计都被数据库搞郁闷了.mysql中最影响速度的就是那些查询非常慢的语句,这些慢的语句,可能是写的不够合理或者 ...

  4. SQL SERVER 查看所有存储过程或视图里 包含某个关键字的查询语句

    SELECT name, type_desc FROM sys.all_sql_modules s INNER JOIN sys.all_objects o ON s.object_id = o.ob ...

  5. 数据库SQL优化分析查询语句总结

    方法一: SELECT TOP 10 TEXT AS 'SQL Statement' ,last_execution_time AS 'Last Execution Time' ,(total_log ...

  6. MySQL中如何分析查询语句

    Oracle中有explain for,mysql中也有同样的功能,那便是explain,举例如下: mysql> explain select (case (select count(*) f ...

  7. MYSQL学习笔记 (六)explain分析查询

    使用EXPLAIN可以模拟优化器执行SQL语句,从而知道MYSQL是如何处理你的SQL,从而分析查询语句或者表结构的瓶颈.

  8. {MySQL的逻辑查询语句的执行顺序}一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析

    MySQL的逻辑查询语句的执行顺序 阅读目录 一 SELECT语句关键字的定义顺序 二 SELECT语句关键字的执行顺序 三 准备表和数据 四 准备SQL逻辑查询测试语句 五 执行顺序分析 一 SEL ...

  9. 对于Oracle中分页排序查询语句执行效率的比较分析

    转自:http://bbs.csdn.net/topics/370033478 对于Oracle中分页排序查询语句执行效率的比较分析 作者:lzgame 在工作中我们经常遇到需要在Oracle中进行分 ...

随机推荐

  1. CF593C Beautiful Function 构造

    正解:构造 解题报告: 传送门! 我知道我咕了好几篇博客似乎,,,但我不听!我就是要发新博客QAQ!(理不直气也壮 这题,想明白了还是比较简单的QwQ实现起来似乎也没有很复杂QAQ 首先思考一下,显然 ...

  2. JSP学习(第一课)

    JSP页面组成: 比如: 打开网页,右键查看源代码: 打开网页: 注意: <%!%>里面定义的属性是成员属性,相当于类的属性,方法相当于是全局的方法,相当于是类里面的方法.但是它是不可以进 ...

  3. 【开发者笔记】利用ab命令对接口进行压力测试

    目标:对接口进行正确性测试和压力测试 工具:Apache-ab 下载 系统:Windows.linux 目标接口:http://www.stagebo.xyz/foru/lifemonths 命令:a ...

  4. Spark提交应用程序之Spark-Submit分析

    1.提交应用程序 在提交应用程序的时候,用到 spark-submit 脚本.我们来看下这个脚本: if [ -z "${SPARK_HOME}" ]; then export S ...

  5. Ubuntu下virtualenv 的安装及使用

    按照这个命令做下来基本是ok的. https://blog.csdn.net/qq_33371343/article/details/78047853

  6. mysql索引之哈希索引

    哈希算法 哈希算法时间复杂度为O(1),且不只存在于索引中,每个数据库应用中都存在该数据结构. 哈希表 哈希表也为散列表,又直接寻址改进而来.在哈希的方式下,一个元素k处于h(k)中,即利用哈希函数h ...

  7. ng-深度学习-课程笔记-11: 卷积神经网络(Week1)

    1 边缘检测( edage detection ) 下图是垂直边缘检测的例子,实际上就是用一个卷积核进行卷积的过程. 这个例子告诉我们,卷积可以完成垂直方向的边缘检测.同理卷积也可以完成水平方向的边缘 ...

  8. c# ArrayList 的排序问题!

    2009-01-19 20:10 c# ArrayList 的排序问题! c# ArrayList 的排序问题! 我看见网上有人用IComparer接口实现ArrayLIst 的排序问题 ,于是自己写 ...

  9. 在Linux系统下统计当前文件夹下的文件个数、目录个数

    1.统计当前文件夹下文件的个数,包括子文件夹里的 ls -lR|grep "^-"|wc -l 如下图: 2.统计文件夹下目录的个数,包括子文件夹里的 ls -lR|grep &q ...

  10. Linux 笔记 #01# 搭建 Python 环境 & vim 代码高亮

    日常收集 vim editor: How do I enable and disable vim syntax highlighting? 搭建 Python 环境 vim editor: How d ...