深入浅出sql的性能优化(二)之索引优化的标尺"Explain"

每天更新java最新最热技术,对java感兴趣的朋友记得关注一下哦。

注意 :这是SQL性能优化第二章,前置内容在上一篇。

今天主要谈如何利用索引对SQl进行优化

我们建索引之前需要一个“标尺”,告诉我们怎么建索引,MySQL给我们提供了一个工具来建索引,它就是“Explain”,我们首先介绍一下“Explain”。

Explain是什么

使用EXPLAIN关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是

如何处理你的SQL语句的。分析你的查询语句或是表结构的性能瓶颈。

知道了是什么,怎么用呢,其实他的用法也很简单,就是Explain + SQL语句。

加了EXPLAIN关键字之后,MySQL就不会执行sql而是生成计划,让你知道你表的读取顺序,

哪些索引可以使用,数据读取操作的操作类型,哪些索引被实际使用,表之间的引用,每张表有多少行被物理查询等等,帮助我们知道怎么去优化。

	(Explain + SQL)
mysql> explain select * from t_order;
(以下是执行结果)
+----+-------------+---------+------+---------------+------+---------+------+-----
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+---------------+------+---------+------+-----
| 1 | SIMPLE | t_order | ALL | NULL | NULL | NULL | NULL | 100453 |
+----+-------------+---------+------+---------------+------+---------+------+-----
1 row in set (0.03 sec)

如图 :就是Explain的用法,是不是看了他生成的结果,看不太懂,别急,接下来我会带大家深入浅出的分析Explain的各个字段。、

1. id

select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序

id一般只有三种情况

1)id相同,执行顺序由上至下

例子

如图 ,我们查询了三张表,他们的id都是1,所以他们的执行顺序是由上至下的

2)id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

如图 ,我们查询了三张表id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

id相同不同,同时存在

如图 ,我们查询了三张表,id如果相同,可以认为是一组,从上往下顺序执行;

在所有组中,id值越大,优先级越高,越先执行

关注点 id号每个号码,表示一趟独立的查询。一个sql 的查询趟数越少越好。

所以,我们写sql时,能不用子查询就不能子查询。

2. table

显示这一行的数据是关于哪张表的,就是说明作用

3.type

type显示查询使用了何种类型,是较为重要的一个指标,结果值从最好到最坏依次是:

system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL

一般来说,得保证查询至少达到range级别,最好能达到ref。如果没有达到。就要考虑建索引了,这也是我们建索引的一个重要依据,那么range以上需要建什么索引, 我们一一讲到

range(where后用了between、<、>、in等的查询,进行了初步筛选)

只检索给定范围的行,使用一个索引来选择行。key 列显示使用了哪个索引 一般就是在你的where语句中出现了between、<、>、in等的查询 这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束语另一点,不用扫描全部索引。

index(筛选没用索引)

出现index是sql使用了索引但是没用通过索引进行过滤,一般是使用了覆盖索引或者是利用索引进行了排序分组

all(全表搜索)

Full Table Scan,将遍历全表以找到匹配的行

4.key

实际使用的索引。如果为NULL,则没有使用索引

查询中若使用了覆盖索引,则该索引和查询的select字段重叠

5.key_len(where条件命中字段)

表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。

key_len字段能够帮你检查是否充分的利用上了索引

6.rows( 越少越好)

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

知道了Explain各个字段的含义后,我们就要动手建索引了,我们在下一篇文件中详细介绍

我们会讲到

单表使用索引及常见索引失效

关联查询优化

子查询优化

排序分组优化等。

发表评论
留言与评论(共有 0 条评论)
   
验证码:

相关文章

推荐文章

'); })();