码农的世界IT技术篇

Mysql索引分析explain

2019-03-28  本文已影响1人  缘来是你ylh

首先问一个问题:如何查询一张表的表结构?答案:desc table_name

没错,但是除了desc还有别的关键字支持哦。先贴上官方文档

{EXPLAIN | DESCRIBE | DESC}
    tbl_name [col_name | wild]

{EXPLAIN | DESCRIBE | DESC}
    [explain_type]
    {explainable_stmt | FOR CONNECTION connection_id}

explain_type: {
    FORMAT = format_name
}

format_name: {
    TRADITIONAL
  | JSON
}

explainable_stmt: {
    SELECT statement
  | DELETE statement
  | INSERT statement
  | REPLACE statement
  | UPDATE statement
}

DESCRIBEEXPLAINDESC语句是同义词, MySQL解析器将它们视为完全同义。实际上,DESCRIBEDESC关键字更常用于获取有关表结构的信息,而EXPLAIN用于获取查询执行计划(即MySQL将如何执行查询的说明)。

下面步入今天的整体,如何利用explain分析sql语句的索引使用情况.现在我有一张t_user表,里面一共有100w的数据

+----+------------+----------+
| id | email      | password |
+----+------------+----------+
|  1 | 1@xxg.com  | 1        |
|  2 | 2@xxg.com  | 2        |
|  3 | 3@xxg.com  | 3        |
|  4 | 4@xxg.com  | 4        |
|  5 | 5@xxg.com  | 5        |
|  6 | 6@xxg.com  | 6        |
|  7 | 7@xxg.com  | 7        |
|  8 | 8@xxg.com  | 8        |
|  9 | 9@xxg.com  | 9        |
| 10 | 10@xxg.com | 10       |
+----+------------+----------+
.........

测试

explain select * from t_user where password=999999

+----+-------------+--------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table  | partitions | type | possible_keys | key  | key_len | ref  | rows   | filtered | Extra       |
+----+-------------+--------+------------+------+---------------+------+---------+------+--------+----------+-------------+
|  1 | SIMPLE      | t_user | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 996966 |    10.00 | Using where |
+----+-------------+--------+------------+------+---------------+------+---------+------+--------+----------+-------------+

下面来分析这里面几个重要的字段

select_type

select_type 表示了查询的类型, 它的常用取值有:

type

type 字段比较重要, 它提供了判断查询是否高效的重要依据依据. 通过 type 字段, 我们判断此次查询是 全表扫描 还是 索引扫描 等.

type 常用的取值有:

type 类型的性能比较

通常来说, 不同的 type 类型的性能关系如下:ALL < index < range ~ index_merge < ref < eq_ref < const < system
ALL 类型因为是全表扫描, 因此在相同的查询条件下, 它是速度最慢的.而 index 类型的查询虽然不是全表扫描, 但是它扫描了所有的索引, 因此比 ALL 类型的稍快.
后面的几种类型都是利用了索引来查询数据, 因此可以过滤部分或大部分数据, 因此查询效率就比较高了.

possible_keys

possible_keys 表示 MySQL 在查询时, 能够使用到的索引. 注意, 即使有些索引在 possible_keys 中出现, 但是并不表示此索引会真正地被 MySQL 使用到. MySQL 在查询时具体使用了哪些索引, 由 key 字段决定.

key

此字段是 MySQL 在当前查询时所真正使用到的索引.

key_len

表示查询优化器使用了索引的字节数. 这个字段可以评估组合索引是否完全被使用, 或只有最左部分字段被使用到.
key_len 的计算规则如下:

rows

rows 也是一个重要的字段. MySQL 查询优化器根据统计信息, 估算 SQL 要查找到结果集需要扫描读取的数据行数.
这个值非常直观显示 SQL 的效率好坏, 原则上 rows 越少越好.

Extra

EXplain 中的很多额外的信息会在 Extra 字段显示, 常见的有以下几种内容:

上一篇 下一篇

猜你喜欢

热点阅读