Mysql索引、explain执行计划

1、索引的使用场景

  哪些情况使用索引:

  1、主键自动建立唯一索引

  2、频繁作为查询条件的字段应该创建索引 where

  3、多表关联查询中,关联字段应该创建索引on两边都要创建索引

    select * from user left join order on user.id = order.userid

  4、查询中排序的字段,应该创建索引B + tree 有顺序

  5、覆盖索引 好处是?不需要回表组合索引

    user表 组合索引(name,age)

    select * from user ------- 全表扫描,没有使用索引

    select name,age from user ---- 索引覆盖,不需要回表。

  6、统计或者分组字段,应该创建索引

  哪些情况不适用索引: 

  1、表记录太少 索引是要有存储的开销

  2、频繁更新 索引要维护

  3、查询字段使用频率不高

  为什么使用组合索引

    由多个字段组成的索引 使用顺序就是创建的顺序

    

    ALTER TABLE ‘table_name‘ ADD INDEX index_name(col1,col2,col3)

    在一颗索引树上由多个字段

    优势: 效率高、省空间、容易形成覆盖索引    

    使用:

      遵循最左前缀原则

    1、前缀索引

      like 常量% 使用索引 like %常量 不使用索引

    2、最左前缀

      从左向右匹配直到遇到范围查询 > < between 索引失效

2、索引失效

    查看索引计划:EXPLAIN 命令    

      可以通过explain命令深入了解MySQL的基于开销的优化器,还可以获得很多可

      能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用。

    eg: explain select * from user where id = 1

    

     *************************** 1. row ***************************

      id: 1

      select_type: SIMPLE

      table: user_info

      partitions: NULL

      type: const

      possible_keys: PRIMARY

  各列的含义如下:

   id: SELECT 查询的标识符. 每个 SELECT 都会自动分配一个唯一的标识符.

   select_type: SELECT 查询的类型.

   table: 查询的是哪个表

      partitions: 匹配的分区

type: join 类型

   possible_keys: 此次查询中可能选用的索引

   key: 此次查询中确切使用到的索引.

   ref: 哪个字段或常数与 key 一起被使用

   rows: 显示此查询一共扫描了多少行. 这个是一个估计值.

   fifiltered: 表示此查询条件所过滤的数据的百分比

   extra: 额外的信息

id

  每个单位查询的SELECT语句都会自动分配的一个唯一标识符,表示查询中操作表的顺序,

  有四种情况:

    id相同:执行顺序由上到下

    id不同:如果是子查询,id号会自增,id越大,优先级越高。

    id相同的不同的同时存在

    id列为null的就表示这是一个结果集,不需要使用它来进行查询。

select_type(重要)

  单位查询的查询类型,比如:普通查询、联合查询(union、union all)、子查询等复杂查询。

包括

    simple

    表示不需要union操作或者不包含子查询的简单select查询。有连接查询时,

       外层的查询为simple,且只有一个

  

  primary

    一个需要union操作或者含有子查询的select,位于最外层的单位

    查询的select_type即为primary。且只有一个

  union

    union连接的两个select查询,第一个查询是dervied派生表,除

    了第一个表外,第二个以后的表select_type都是union

  dependent union

    与union一样,出现在union 或union all语句中,但是这个查询要

    受到外部查询的影响

  union result

    包含union的结果集,在union和union all语句中,因为它不需要参

    与查询,所以id字段为null

  subquery

    除了from字句中包含的子查询外,其他地方出现的子查询都可能

    是subquery

  dependent subquery

    与dependent union类似,表示这个subquery的查询要受到外部表

    查询的影响

  derived

    from字句中出现的子查询,也叫做派生表,其他数据库中可能叫

    做内联视图或嵌套select

table

  显示的单位查询的表名,有如下几种情况:

  •   如果查询使用了别名,那么这里显示的是别名
  •   如果不涉及对数据表的操作,那么这显示为null
  •   如果显示为尖括号括起来的就表示这个是临时表,后边的N就是执行计划中的id,表示结果来自于这个查询产生。
  •   如果是尖括号括起来的<union M,N>,与类似,也是一个临时表,表示这个结果来自于union查询的id为M,N的结果集。
type(重要)

  显示的是单位查询的连接类型或者理解为访问类型,访问性能依次从好到差:

    system、const、eq_ref、ref、fulltext、ref_or_null、unique_subquery、index_subquery、

    range、index_merge、index、ALL

  注意事项:   

    - 除了all之外,其他的type都可以使用到索引

    - 除了index_merge之外,其他的type只可以用到一个索引

    - 最少要使用到range级别

possible_keys

  此次查询中可能选用的索引,一个或多个

  key查询真正使用到的索引,select_type为index_merge时,这里可能出现两个以上的索引,其他的

  select_type这里只会出现一个。

key_len

  用于处理查询的索引长度,如果是单列索引,那就整个索引长度算进去,如果是多列索引,那么查

  询不一定都能使用到所有的列,具体使用到了多少个列的索引,这里就会计算进去,没有使用到的

  列,这里不会计算进去。

  留意下这个列的值,算一下你的多列索引总长度就知道有没有使用到所有的列了。

  另外,key_len只计算where条件用到的索引长度,而排序和分组就算用到了索引,也不会计算到

  key_len中。

ref

  如果是使用的常数等值查询,这里会显示const

  如果是连接查询,被驱动表的执行计划这里会显示驱动表的关联字段

  如果是条件使用了表达式或者函数,或者条件列发生了内部隐式转换,这里可能显示为func

rows

  这里是执行计划中估算的扫描行数,不是精确值(InnoDB不是精确的值,MyISAM是精确的值,主要原

  因是InnoDB里面使用了MVCC并发机制)

extra(重要)

  这个列包含不适合在其他列中显示单十分重要的额外的信息,这个列可以显示的信息非常多,有几十

  种,常用的有:using fifilesort(重要)、using index(重要)、using index condition(重要)、

          using temporary、distinct、using where(重要)

  

    using fifilesort(重要):

  •            排序时无法使用到索引时,就会出现这个。常见于order by和group by语句中
  •         说明MySQL会使用一个外部的索引排序,而不是按照索引顺序进行读取。
  •         MySQL中无法利用索引完成的排序操作称为“文件排序”

索引失效分析

  

原文地址:https://www.cnblogs.com/vindycxy/p/12685130.html

时间: 2024-07-30 02:24:34

Mysql索引、explain执行计划的相关文章

MySQL索引及执行计划

MySQL索引及执行计划 索引 合理的建立索引可以加快数据查询,例如,学校图书管为每一本书编号,根据编号可以快速锁定一本书所在位置.MySQL索引默认B+树索引.索引虽然能够提高检索效率,但同时也会降低更新的速度,因为insert .update.delete也会操作索引文件,会调整因为更新等操作带来的键值变化后的索引信息. 索引类型 主键索引:唯一索引,并且并指定为primary key,每个表中只能有一个主键 唯一索引:索引列的所有值都只能出现一次,即值必须唯一,值可以为空 普通索引:基本的

网站优化—mysql explain执行计划

explain执行计划 简介MySQL调优: 先发现问题(慢查询,profile) 对于使用索引和没有使用索引,了解到索引可以快速去查找数据 了解什么是索引(索引是排好序的快速查找的数据结构) 索引的管理(查看,创建,删除) 索引的本身的数据结构(B-TREE结构和聚簇结构) MySQL是如何去使用这些索引的(explain工具),需要去发现索引是否合理的被使用,防止索引滥用. ? 注意:索引对查询是有帮助的,但是对更新是没有好处的.索引要建立的合理. ? MySQL调优的一个通用思路(面试题)

mysql explain执行计划详解

1).id列SELECT识别符.这是SELECT查询序列号.这个不重要,查询序号即为sql语句执行的顺序 2).select_type列常见的有: A:simple:表示不需要union操作或者不包含子查询的简单select查询.有连接查询时,外层的查询为simple,且只有一个 B:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary.且只有一个 C:union:union连接的两个select查询,第一个查询是de

MySQL 优化sql explain执行计划详解

mysql explain执行计划详解 1).id列数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. 2).select_type列常见的有:A:simple:表示不需要union操作或者不包含子查询的简单select查询.有连接查询时,外层的查询为simple,且只有一个B:primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary.且只有一个C:

[转载] EXPLAIN执行计划中要重点关注哪些要素

原文: https://mp.weixin.qq.com/s?__biz=MjM5NzAzMTY4NQ==&mid=400738936&idx=1&sn=2910b4119b9943bafdcfe950dc89e028&scene=0&uin=Mjk1ODMyNTYyMg%3D%3D&key=04dce534b3b035ef3da41c55e69b6792390d87f8207be3e924d28fab0b6ac41a02549bf7410a7849c9f2

EXPLAIN执行计划中要重点关注哪些要素(叶金荣)

原文:http://mp.weixin.qq.com/s/CDKN_nPcIjzA_U5-xwAE5w 导读 EXPLAIN的结果中,有哪些关键信息值得注意呢? MySQL的EXPLAIN当然和ORACLE的没法比,不过我们从它输出的结果中,也可以得到很多有用的信息. 总的来说,我们只需要关注结果中的几列: 列名 备注 type 本次查询表联接类型,从这里可以看到本次查询大概的效率 key 最终选择的索引,如果没有索引的话,本次查询效率通常很差 key_len 本次查询用于结果过滤的索引实际长度

解读EXPLAIN执行计划中的key_len(转)

原文:http://imysql.com/2015/10/20/mysql-faq-key-len-in-explain.shtml 导读 EXPLAIN中的key_len一列表示什么意思,该如何解读? EXPLAIN执行计划中有一列 key_len 用于表示本次查询中,所选择的索引长度有多少字节,通常我们可借此判断联合索引有多少列被选择了.key_len越短越好,说白了就是字段类型越短越好 在这里 key_len 大小的计算规则是: 一般地,key_len 等于索引列类型字节长度,例如int类

MYSQL EXPLAIN执行计划命令详解(支持更新中)

本文来自我的github pages博客http://galengao.github.io/ 即www.gaohuirong.cn 摘要: 本篇是根据官网中的每个一点来翻译.举例.验证的:英语不好,所以有些话语未必准确,请自行查看官网,若有些点下面没有例子的是因为当时一下子没有想出那么多来,如果大家有遇上好的例子,欢迎在下面留言我持续更新 查看执行计划的关键EXPLAIN 版本MYSQL5.6,用到的库是官网例子sakila,自行下载导入 由于要把每个点都翻译出来,还需要举例,所以需要一定的时间

MYSQL explain执行计划

用explain查看SQL的执行计划 在工作中,我们用于捕捉性能问题最常用的就是打开慢查询,定位执行效率差的SQL,那么当我们定位到一个SQL以后还不算完事,我们还需要知道该SQL的执行计划,比如是全表扫描,还是索引扫描,这些都需要通过EXPLAIN去完成. EXPLAIN命令是查看优化器如何决定执行查询的主要方法.可以帮助我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用. 需要注意的是,生成的QEP并不