MySQL学习----explain查看一条sql 的性能

在开发的过程中,对于我们写的sql语句,我们有时候会考虑sql语句的性能,那么explain就是首选。Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好的优化语句。

Explain语法:explain select … from … [where ...]

例如:explain select * from news;

输出:

+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+

下面对各个属性进行了解:

1、id:这是SELECT的查询序列号

2、select_type:select_type就是select的类型,可以有以下几种:

SIMPLE:简单SELECT(不使用UNION或子查询等)
PRIMARY:最外面的SELECT
UNION:UNION中的第二个或后面的SELECT语句
DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询
UNION RESULT:UNION的结果。
SUBQUERY:子查询中的第一个SELECT
DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询
DERIVED:导出表的SELECT(FROM子句的子查询)

3、table:显示这一行的数据是关于哪张表的

4、type:这列最重要,显示了连接使用了哪种类别,有无使用索引,是使用Explain命令分析性能瓶颈的关键项之一。

结果值从好到坏依次是:
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
一般来说,得保证查询至少达到range级别,最好能达到ref,否则就可能会出现性能问题。

5、possible_keys:列指出MySQL能使用哪个索引在该表中找到行

6、key:显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL

7、key_len:显示MySQL决定使用的键长度。如果键是NULL,则长度为NULL。使用的索引的长度。在不损失精确性的情况下,长度越短越好

8、ref:显示使用哪个列或常数与key一起从表中选择行。

9、rows:显示MySQL认为它执行查询时必须检查的行数。

10、Extra:包含MySQL解决查询的详细信息,也是关键参考项之一。

Distinct
一旦MYSQL找到了与行相联合匹配的行,就不再搜索了
Not exists
MYSQL 优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,
就不再搜索了
Range checked for each
Record(index map:#)
没有找到理想的索引,因此对于从前面表中来的每一 个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。这是使用索引的最慢的连接之一
Using filesort
看 到这个的时候,查询就需要优化了。MYSQL需要进行额外的步骤来发现如何对返回的行排序。它根据连接类型以及存储排序键值和匹配条件的全部行的行指针来 排序全部行
Using index
列数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表 的全部的请求列都是同一个索引的部分的时候
Using temporary
看到这个的时候,查询需要优化了。这 里,MYSQL需要创建一个临时表来存储结果,这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上
Using where
使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。如果不想返回表中的全部行,并且连接类型ALL或index, 这就会发生,或者是查询有问题

  

原文地址:https://www.cnblogs.com/ricklz/p/9824411.html

时间: 2024-10-12 15:44:23

MySQL学习----explain查看一条sql 的性能的相关文章

mysql -- 一次执行多条sql语句

最近要做一个软件升级,其中涉及到数据库表字段的变动(新增或删除或修改),所有的关于数据库的变动的sql语句都是存放在Sqlupdate.sql文件中,每次升级的时候都需要执行一次Sqlupdate.sql里的所有sql语句,这就涉及到执行多条语句的问题了.软件在CodeIgniter框架上开发的,CodeIgniter有封装好的执行sql语句的函数:$this->db->query('****'),但此函数一次只能执行一条sql语句.所以得另外想办法了.百度了下,找到了一些资料.multi_q

mysql 插入更新在一条sql ON DUPLICATE KEY UPDATE

有时候需要进行数据操作的,如果有数据则更新数据, 没有数据则插入. 以往的做法是先查询,再根据查询结果进行判断,执行插入或更新操作 其实 有一种 ON DUPLICATE KEY UPDATE 语法, 可以在一条sql里完成上述逻辑操作. INSERT INTO tbPrize(sOpenid,iAreaId,iPlatId,SSSgroupOne,SSSgroupTwo,SSgroupOne,SSgroupTwo,SgroupOne,SgroupTwo,dtFound) VALUES ('2A

MySQL学习【第五篇SQL语句上】

一.mysql命令 1.连接服务端命令 1.mysql -uroot -p123 -h127.0.0.1 2.mysql -uroot -p123 -S /tmp/mysql.sock 3.mysql -uroot -p123 -hlocalhost 4.mysql -uroot -p123 2.mysql登陆后的一些命令 1.\h或者help   查看帮助 2.\G  格式化查看数据(以key:value形式) 3.\T 或 tee      记录日志 4.\c   结束命令 5.\s或者st

Mysql++学习(五)------专用SQL结构

专用SQL结构(SSQLS) 特性可以让你很轻易的定义用来匹配SQL表的C++结构.最通俗的理解:对于SQL表中的每一个字段,SSQLS结构都有一个变量与之对应.但是,MySQL++内部也会使用SSQLS的其他方法,操作符来提供简洁的功能. 要定义SSQLSes,需要使用定义在ssqls.h中的宏,这也是MySQL++唯一没有自动加入mysql++.h的头文件. sql_create 假如你有如下SQL表 CREATE TABLE stock ( item CHAR(30) NOT NULL,

MySQL学习笔记-查看表,修改表,删除表

/*看表*/ describe test --查看表的结构 show create table test --查看表的创建语句 show create table test  \G --将创建的语句查询出来,并规范化显示(只在console下支持此命令,因为只有console下会错乱显示...) /*改表*/ alter table test rename to testo; --将test改名为testo alter table example0 rename to user; select 

(MYSQL学习笔记5)防止SQL注入

MYSQL服务器并不存在共享池(我也不清楚共享池是什么)的概念,所以在MYSQL上使用绑定变量最大的好处就是为了防止SQL注入. PHP例子: $stmt = $dbh -> prepare("SELECT * FROM users WHERE username=? AND password=?"): $stmt -> execute(array($username,$password)); 即使传入的变量中,带有"angel ' or 1=1'"的条件

mysql学习-explain

表头包含有: id---select_type---table---type---possible_keys---key---key_len---ref---rows---Extra id:select 查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序,分为三种情况: 三种情况: 1.id相同,执行顺序由上至下 2.id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行 3.id相同不同,id大的先执行,同级为由上到下 DERIVED 衍生 selec

mysql学习-explain中的extra

覆盖索引就是创建的索引和查询的字段正好个数顺序一致 using filesort:mysql使用了一个外部索引 ,而非表内索引顺序进行访问,,mysql无法利用索引完成的排序操作称为文件索引,如果你创建了索引,但并没按索引个数顺序进行查询就会出现 using temporary:使用了临时保存中间结果,mysql在对查询结果排序时使用临时表,常见于排序order by 和分组查询group by . using index:使用了覆盖索引 原文地址:https://www.cnblogs.com

MySQL学习_查看各仓库产品的销售情况_20161102

订单表结构是具体到每个订单下面多个产品,而仓库出货的表结构是对每个订单的金额汇总 不区分订单产品 因此如果想计算每个仓库每个产品的销售情况 需要将两个表连接起来 并且产品是昨天在线且有库存的产品 #昨日在线且有库存的SKU SELECT a.城市,a.仓库,b.* ,SUM(a.订单额) AS 历史15天金额 ,SUM(a.销量) AS 历史15天销量 ,SUM(IF(a.订单日期>=DATE_ADD(CURRENT_DATE,INTERVAL - 7 DAY) AND a.订单日期<CURR