我的编程空间,编程开发者的网络收藏夹
学习永远不晚

使用Explain分析select语句

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

使用Explain分析select语句

explain可以分析某条select语句会查询多少条记录、以怎样的方式查询,以及复杂select的执行顺序,借此可以了解到select语句的性能和查询是如何执行的

如: select子句和from子句,先执行from子句

ps: 我们的服务器上mysql版本是5.1.73,mysql 5.6 explain能对update、insert等进行解释


第一步:先插入大量数据,因为explain的结果和数据库实际的数据有关系

delimiter $$                   
drop procedure if exists addoplist;
create procedure addoplist(in mpoint int, in mproductid int, in mnum int)
begin
declare id int;
declare maid int;
declare msid int;
declare mpid int;
set id=0;
while id<mnum do
select aid, sid, rid into maid, msid, mpid from tbl_roles where aid>=((select max(aid) from tbl_roles) - (select min(aid) from tbl_roles))*rand() + (select min(aid) from tbl_roles) limit 1;
insert table_oplist(optype, aid, sid, pid, optime, rid, point, freeze, productid, device) values(1, maid, msid, mpid, UNIX_TIMESTAMP(), 0, mpoint, 0, mproductid, concat("qwerwqrqwrwdxcvzxvdfge", round(rand()*1000)));
set id=id+1;
end while;
end$$
delimiter ;
call addoplist(30, 1010, 300000);


第二步:expalin解释了哪些有用信息 例:explain select count(*) from table_oplist where device="qwerwqrqwrwdxcvzxvdfge52";

+----+-------------+------------+------+---------------+---------------+---------+-------+------+--------------------------+
| id | select_type | table      | type | possible_keys | key           | key_len | ref   | rows | Extra                    |
+----+-------------+------------+------+---------------+---------------+---------+-------+------+--------------------------+
|  1 | SIMPLE      | tbl_oplist | ref  | oplist_device | oplist_device | 131     | const |  307 | Using where; Using index |

+----+-------------+------------+------+---------------+---------------+---------+-------+------+--------------------------+

1> rows列是mysql估计为了找到所需的行而要读取的行数; 这个估算可能不精确,也反映不出limit的作用; 结果有多行时,所有rows列的值相乘来粗略估算整个查询要读的行数;

rows和数据库的实际总行数有关;

2> type列我认为是最重要的一列

ALL     :按行全表扫描;当查询中使用了limit时,并不是全表,而是找到limit的几个就不再扫描了;或者在Extra列显示“Using distinct/not exists”(暂时没见过);

index   :按索引次序全表扫描,而不是按行;当Extra列显示"Using index",说明使用的是覆盖索引,只扫描索引的数据,而不是按索引全表扫描;

range  : 相对于index来说,它是一个范围的索引扫描,不一定但通常出现在select语句中带有between或者where子句里带有>等比较符; 出现在in ()子句或or列表的情况(目前不太清楚)

ref       : 索引访问,索引跟参考值相比较,返回所有匹配行;它可能找到多个符合条件的行;查找+扫描;只有当使用非唯一索引或唯一索引的非唯一性前缀时才发生;ref_or_null也属于这类(在初次查找的结果里进行第二次查找以找出NULL条目)

eq_ref  :最多返回一条符合条件的记录,在使用主键或者唯一性索引查找时可看到;

const, system :mysql能对查询的某部分进行优化并转换成一个常量时,就会使用这个类型;例如:将主键放在where子句来选这行的主键时,就会被转换成常量

NULL   :mysql在优化阶段分解查询语句,在执行阶段甚至用不着再访问表或索引;

ref图

mysql> create index oplist_device on table_oplist(device);

mysql> explain select * from table_oplist where  device="";
+----+-------------+------------+------+---------------+---------------+---------+-------+------+-------------+
| id | select_type | table      | type | possible_keys | key           | key_len | ref   | rows | Extra       |
+----+-------------+------------+------+---------------+---------------+---------+-------+------+-------------+
|  1 | SIMPLE      | tbl_oplist | ref  | oplist_device | oplist_device | 131     | const |    4 | Using where |

+----+-------------+------------+------+---------------+---------------+---------+-------+------+-------------+

没有索引时:

mysql> explain select distinct aid from table_oplist where  device="";
+----+-------------+------------+------+---------------+------+---------+------+------+------------------------------+
| id | select_type | table      | type | possible_keys | key  | key_len | ref  | rows | Extra                        |
+----+-------------+------------+------+---------------+------+---------+------+------+------------------------------+
|  1 | SIMPLE      | tbl_oplist | ALL  | NULL          | NULL | NULL    | NULL | 5180 | Using where; Using temporary |

+----+-------------+------------+------+---------------+------+---------+------+------+------------------------------+

const图

mysql> explain select * from table_account where account="test02222";
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+
| id | select_type | table       | type  | possible_keys | key     | key_len | ref   | rows | Extra |
+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+
|  1 | SIMPLE      | tbl_account | const | PRIMARY       | PRIMARY | 66      | const |    1 |       |

+----+-------------+-------------+-------+---------------+---------+---------+-------+------+-------+


3> select_type

simple     : 简单select,不包括子查询和union

primary   : 查询中若包含任何复杂的子部分,最外层的select被标记为primary

derived    : 对应的table列是<derivedN>

当explain输出 select_type为derived时,表示一个嵌套范围的开始,如果后面的id较小,代表嵌套已结束;

subquery  : select 子句

union       : union中的第二个或后面的select语句

union result: union的结果

4> table

表示对应行正在访问的表;当from子句中有子查询或有union时,table列会变得复杂;

当from子句中有子查询时,table列是<derivedN>,N是explain输出中后面一行的id

5> key

这一列显示的是优化采用的哪一个索引可以最小化查询成本;不一定出现在 possible_keys中

6> ref

这一列显示了在key列记录的索引中查找值所用的列或常量,值为null时仅表示啥都没使用;


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

使用Explain分析select语句

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL中EXPLAIN语句怎么使用

这篇文章主要介绍了MySQL中EXPLAIN语句怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇MySQL中EXPLAIN语句怎么使用文章都会有所收获,下面我们一起来看看吧。前言在MySQL中 DESCR
2023-06-30

MySQL中EXPLAIN语句如何使用

这篇文章主要介绍了MySQL中EXPLAIN语句如何使用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。在MySQL优化的环节上,我们首先需要知道的就是我们当前的这句SQL语句
2023-06-14

MySQL EXPLAIN语句的使用示例

在MySQL优化的环节上,我们首先需要知道的就是我们当前的这句SQL语句在实际的数据库中究竟是怎么执行的,才能谈要如何优化它。而在MySQL中,就给我们提供了模拟语句执行的一个非常好用的关键字:EXPLAIN。EXPLAIN可以用来查看SQ
2022-05-28

mysql 使用profiling和explain查询语句性能解析

MySQL优化性能的关键工具:Profiling和EXPLAIN。Profiling收集查询执行数据,识别慢速步骤,而EXPLAIN提供查询执行计划信息。分析Profiling数据时,关注连接时间、执行时间、最慢步骤。分析EXPLAIN输出时,重点关注连接类型、潜在索引、预计行数。综合使用Profiling和EXPLAIN,深入了解性能问题并采取优化措施。此外,创建索引、优化查询、调整缓冲池和监控数据库等技巧也有助于提升性能。
mysql 使用profiling和explain查询语句性能解析
2024-04-02

access select语句怎么使用

SELECT语句用于从数据库中选择数据。它的基本语法如下:```sqlSELECT 列名1, 列名2, ... FROM 表名 WHERE 条件```其中,列名是要选择的数据列,可以是单个列或多个列,用逗号分隔。表名是要从中选择数据的表名称
2023-09-22

golang select语句怎么使用

在Go语言中,select语句用于在多个通信操作中选择一个进行执行。select语句的基本语法如下:goselect {case <- channel1: // 执行channel1的操作case data := <- channel
2023-10-21

MySQL中explain语句的使用方法

小编给大家分享一下MySQL中explain语句的使用方法,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、概述在 MySQL 中,我们可以使用慢查询日志或者 s
2023-06-14

asp中select语句怎么使用

在ASP中使用SELECT语句查询数据库可以通过以下步骤来实现:1. 创建数据库连接对象:```Set conn = Server.CreateObject("ADODB.Connection")conn.Open "Provider=Mi
2023-09-25

SQLite的SELECT语句如何使用

这篇文章主要讲解了“SQLite的SELECT语句如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“SQLite的SELECT语句如何使用”吧!语法SQLite 的 SELECT 语句的
2023-06-27

golang中select语句怎么使用

这篇文章主要介绍“golang中select语句怎么使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“golang中select语句怎么使用”文章能帮助大家解决问题。前言在golang语言中,sel
2023-07-02

MySQL的select语句如何使用

今天小编给大家分享一下MySQL的select语句如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。select语句可
2023-06-27

java的select语句怎么使用

在Java中,可以使用JDBC(Java Database Connectivity)来执行SQL查询语句。以下是一个使用JDBC执行SELECT语句的示例:1. 导入必要的包:```javaimport java.sql.*;```2.
2023-09-20

VBS中Select Case语句的使用

本篇内容介绍了“VBS中Select Case语句的使用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Select Case 语句根据表达式
2023-06-08

MySQL的select语句怎么使用

这篇“MySQL的select语句怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“MySQL的select语句怎么使用
2023-06-27

vb select case语句怎么使用

在VB中,Select Case语句用于根据不同的条件执行不同的代码块。下面是Select Case语句的基本语法:Select Case expressionCase value1' 执行代码块1Case value2' 执行代码块2C
vb select case语句怎么使用
2024-02-29

for语句使用实例分析

今天小编给大家分享一下for语句使用实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、前言在批处理中,for是最为强
2023-06-09

MySQL中explain语句的基本使用教程

一、概述 在 MySQL 中,我们可以使用慢查询日志或者 show processlist 命令等方式定位到执行耗时较长的 SQL 语句,在这之后我们可以通过 EXPLAIN或者 DESC 命令获取 MySQL 如何执行 SELECT 语句
2022-05-14

编程热搜

目录