MySQL查询分析器EXPLAIN或DESC

MySQL可以通过EXPLAIN或DESC来查看并分析SQL语句的执行情况,如下需要计算2006年所有公司的销售额,需要关联sales表和company表,并且对money字段做求和操作,相应SQL如下:

Sql代码
EXPLAIN SELECT SUM(money) FROM sales s,company c WHERE s.company_id=c.id AND s.year=2006 \G;

*************************** 1. row ***************************
id: 1 www.2cto.com
select_type: SIMPLE
table: s
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 1000
Extra: Using where

*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: c
type: ref
possible_keys: index_company_id
key: index_company_id
key_len: 5
ref: sakila.c.company_id
rows: 1 www.2cto.com
Extra: Using where; Using index

列的说明:
select_type: 表示SELECT的类型,常见的有下面几种
SIMPLE: 简单表,不使用连接或子查询的
PRIMARY: 主查询,即外层的查询
UNION: UNION中的第二个或者后面的查询语句
SUBQUERY: 子查询中的第一个SELECT

table: 输出结果集的表

type: 表示表的连接类型,性能由好到差的连接类型为下面顺序
system: 表中只有一行,即常量表
const: 单表中最多有一个匹配行,如primary key或unique index
eq_ref: 对于前面的每一行,在此表中只查询一条记录,也就是多表连接中使用primary key或unique index
ref: 与eq_ref类似,区别在于不是使用primary key或unique index,而是使用普通索引
ref_or_null: 与ref类型,区别在于条件中包含对null的查询
index_merge: 索引合并优化
unique_subquery: in的后面是一个查询主键字段的子查询
index_subquery: 与unique_subquery类似,区别在于in的后面是查询非唯一索引字段的子查询 www.2cto.com
range: 单表中的范围查询
index: 对于前面的每一行,都通过查询索引来得到数据
all: 对于前面的每一行,都通过扫描全表来得到数据

possible_keys: 查询时可能用到的索引

key: 查询时实际使用到的索引

key-len: 索引字段的长度

rows: 扫描行的数量

Extra: 执行情况的说明和描述

通过EXPLAIN的分析,确认在上面的例子中是对sales表的全表扫描导致效率不理想,通过对sales表创建索引: www.2cto.com
Sql代码
CREATE INDEX index_sales_year ON sales(year);

创建索引后,再对该查询语句分析如下:
Sql代码
EXPLAIN SELECT SUM(money) FROM sales s,company c WHERE s.company_id=c.id AND s.year=2006 \G;

*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: s
type: ref
possible_keys: index_seles_year
key: index_sales_year
key_len: 2
ref: const
rows: 1
Extra: Using where

*************************** 2. row ***************************
id: 1 www.2cto.com
select_type: SIMPLE
table: c
type: ref
possible_keys: index_company_id
key: index_company_id
key_len: 5
ref: sakila.c.company_id
rows: 1
Extra: Using where; Using index
-----------------------------------------------------------------

时间: 2024-08-28 03:02:57

MySQL查询分析器EXPLAIN或DESC的相关文章

mysqldumpslow 分析slow query日志和explain分析mysql查询结构

mysqldumpslow的使用:比如我们要查询按时间返回前5条日志信息,格式如下:mysqldumpslow -s t -t 5 /var/log/mysql/slowquery_20180303.log 参数说明:-s:排序方式 按锁的时间l.返回的记录数r.查询的时间t.记录的次数c,倒序的话可以加r-t:查询前多少条记录-g:支持正则表达式,以及忽略大小写 顺便说下explainexplain用来分析mysql查询结构的主要关注四个参数值:type.key.rows.extras访问类型

MySQL 查询语句优化思路

query 语句的优化思路和原则主要提现在以下几个方面:1. 优化更需要优化的Query:2. 定位优化对象的性能瓶颈:3. 明确的优化目标:4. 从 Explain 入手:5. 多使用profile6. 永远用小结果集驱动大的结果集:7. 尽可能在索引中完成排序:8. 只取出自己需要的Columns:9. 仅仅使用最有效的过滤条件:10. 尽可能避免复杂的Join和子查询 关于explain 用法:explain select * from tables1 where 1 ... 先看一下在

MySQL查询优化之explain的深入解析

MySQL查询优化之explain的深入解析 作者: 字体:[增加 减小] 类型:转载 时间:2013-06-13我要评论 本篇文章是对MySQL查询优化中的explain进行了详细的分析介绍,需要的朋友参考下 在分析查询性能时,考虑EXPLAIN关键字同样很管用.EXPLAIN关键字一般放在SELECT查询语句的前面,用于描述MySQL如何执行查询操作.以及MySQL成功返回结果集需要执行的行数.explain 可以帮助我们分析 select 语句,让我们知道查询效率低下的原因,从而改进我们查

MySQL执行计划 EXPLAIN参数

MySQL执行计划参数详解 转http://www.jianshu.com/p/7134286b3a09 MySQL数据库中,在SELECT查询语句前边加上“EXPLAIN”或者“DESC”关键字,即可查看该查询语句的执行计划,分析执行计划是优化慢查询的重要手段.如: EXPLAIN SELECT * FROM school; DESC SELECT * FROM school; 执行结果: 执行计划参数.png 接下来对这10个参数进行简单解释: 1.id:在整个查询中SELECT的位置: 2

MySQL 灵异事件一则 -- desc报语法错误

今天有一开发同学找到我,说查询SQL中倒序报错,不明原因,于是奔赴工位现场研究情况. 果然,只要SQL中带有desc 就会报错,而ASC没问题. 哪怕desc放在句首用作explain也会报错. 报错信息为语法错误... 检查了sql-mode发现是空,看来不是这个原因,那问题出在哪呢? 测试库的环境是保存在windows个人电脑中的,开发MM说,以前没遇到过这个情况,但是最近为了图省事,在windows的msconfig中配置了MySQL开机启动,然后就这样了. 于是shutdown数据库,手

MySQL查询杂记

MySQL查询 杂项 1.显示当前系统时间 MariaDB [hellodb]> SELECT NOW(); +---------------------+ | NOW() | +---------------------+ | 2017-01-20 05:10:32 | +---------------------+ 2.去除重复的内容查询 只保留一样数据: MariaDB [hellodb]> SELECT DISTINCT GENDER FROM students; +--------+

mysql查询、子查询、连接查询

mysql查询.子查询.连接查询 一.mysql查询的五种子句 where子句(条件查询):按照“条件表达式”指定的条件进行查询. group by子句(分组):按照“属性名”指定的字段进行分组.group by子句通常和count().sum()等聚合函数一起使用. having子句(筛选):有group by才能having子句,只有满足“条件表达式”中指定的条件的才能够输出. order by子句(排序):按照“属性名”指定的字段进行排序.排序方式由“asc”和“desc”两个参数指出,默

MySQL 查询语句使用进阶

MySQL 查询语句使用进阶 =============================================================================== 概述: =============================================================================== 练习: 练习1  首先导入hellodb.sql的脚本文件,查询其数据库和表如下: [[email protected] ~]# mysql 

mysql查询练习

mysql> #查询每个栏目最贵的商品 mysql> select goods_id,shop_price,cat_id from (select goods_id,shop_price,cat_id from goods order by shop_price desc) as temp group by cat_id; +----------+------------+--------+ | goods_id | shop_price | cat_id | +----------+----