每天更新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 条评论) |