mysql-----性能,explain的结果

mysql> explain select * from a,b where a.a_id = b.a_id;
+----+-------------+-------+------------+--------+---------------+---------+---------+----------------+------+----------+-------------+
| id | select_type | table | partitions | type   | possible_keys | key     | key_len | ref            | rows | filtered | Extra       |
+----+-------------+-------+------------+--------+---------------+---------+---------+----------------+------+----------+-------------+
|  1 | SIMPLE      | b     | NULL       | ALL    | b_to_a        | NULL    | NULL    | NULL           |    3 |   100.00 | Using where |
|  1 | SIMPLE      | a     | NULL       | eq_ref | PRIMARY       | PRIMARY | 8       | db_name.b.a_id |    1 |   100.00 | NULL        |
+----+-------------+-------+------------+--------+---------------+---------+---------+----------------+------+----------+-------------+
2 rows in set, 1 warning (0.06 sec)

mysql> explain select * from a,b where a.a_id = b.a_id \G;
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: b
   partitions: NULL
         type: ALL
possible_keys: b_to_a
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 3
     filtered: 100.00
        Extra: Using where
*************************** 2. row ***************************
           id: 1
  select_type: SIMPLE
        table: a
   partitions: NULL
         type: eq_ref
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 8
          ref: db_name.b.a_id
         rows: 1
     filtered: 100.00
        Extra: NULL
2 rows in set, 1 warning (0.00 sec)

id:查询的序列号,包含一组数字,表示查询中执行select子句或者操作表的顺序;
   id相同,执行顺序从上至下,如例子表示先加载b再加载a;
   id递增,越大越先被执行
   id有相同有不同:越大越先被执行,相同的再顺序执行。
select_type:查询类型,主要用来区别是普通查询、联合查询、子查询、复杂查询
    simple:只有一个select,无子查询或者union
    primary:如果包含子查询,那么外层是primary
    subquery: 子查询
    derived:衍生表,子查询的结果
    union:含有union关键字
    union result:从union表中获取结果(join的双外结果)
type:访问类型,确定是否使用了优化
     all index range ref eq_ref const,system NULL
     最好到最差:
         system >const > eq_ref > ref > range > index > all(当百万级别时,全表查询默认值就是all)
         一般来说,在开发中能保证时range 或者 ref 级别就可以了。
     
     system:当表只有一行记录时,是system
     const:通过index1次找到,经常出现在主键索引或者唯一索引中,如子查询中的条件是唯一的一个数值。
     eq_ref:唯一性索引扫描,意思是拿唯一性索引找到后结果只有一条
     ref:非唯一性索引扫描,相对于上一个eq_ref,返回匹配某个值的所有行
     range:只给定范围的查询,如between..and,in,>,<等。
     index:使用了index的扫描查询。     
possible_keys:列出查询中可能用到的索引
          key:
          (1)是否用到了索引
          (2)实际用到了哪些索引。如果结果是NULL,表示可能没有建索引,也可能索引失效
key_len:表示查询时可能用到的索引长度
ref:显示索引的哪一列被使用了。
rows:根据表的信息以及使用索引的情况估算出大致需要查询的行数
extra:包含不适合在其他列中显示但是又十分重要的额外信息
     using filesort:mysql中无法利用索引完成的排序被称为“文件排序”,经常出现在创建了复合索引但是却没有按顺序使用的情况。
     using tempoprary:使用了临时表,常见于order by 和group by
     using index:使用了索引,是个好消息
     using where:使用了where条件查询,如果和using index一起出现就是好现象
     using join buff:使用了缓冲,配置文件的值可以适当调大
     impossiable where:where子句的值总是false

发布了76 篇原创文章 · 获赞 21 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/shen_chengfeng/article/details/104444583