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中无法利用索引完成的排序操作称为“文件排序”

索引失效分析

  

 

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

  1. 学会使用MySQL的Explain执行计划,SQL性能调优从此不再困难

    上篇文章讲了MySQL架构体系,了解到MySQL Server端的优化器可以生成Explain执行计划,而执行计划可以帮助我们分析SQL语句性能瓶颈,优化SQL查询逻辑,今天就一块学习Explain执 ...

  2. (4) MySQL中EXPLAIN执行计划分析

    一. 执行计划能告诉我们什么? SQL如何使用索引 联接查询的执行顺序 查询扫描的数据函数 二. 执行计划中的内容 SQL执行计划的输出可能为多行,每一行代表对一个数据库对象的操作 1. ID列 ID ...

  3. MySQL之EXPLAIN 执行计划详解

    explain 可以分析 select 语句的执行,即 MySQL 的“执行计划. 一.type 列 MySQL 在表里找到所需行的方式.包括(由左至右,由最差到最好): | All | index ...

  4. MySQL优化-》执行计划和常见索引

    MySql的explain执行计划 explain是一个Mysql性能显示的工具,它显示了MySQL如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句.在开发当 ...

  5. Python进阶----索引原理,mysql常见的索引,索引的使用,索引的优化,不能命中索引的情况,explain执行计划,慢查询和慢日志, 多表联查优化

    Python进阶----索引原理,mysql常见的索引,索引的使用,索引的优化,不能命中索引的情况,explain执行计划,慢查询和慢日志, 多表联查优化 一丶索引原理 什么是索引:       索引 ...

  6. MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划

    这篇文章主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下 一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存 ...

  7. python/MySQL(索引、执行计划、BDA、分页)

    ---恢复内容开始--- python/MySQL(索引.执行计划.BDA.分页) MySQL索引: 所谓索引的就是具有(约束和加速查找的一种方式)   创建索引的缺点是对数据进行(修改.更新.删除) ...

  8. 第九课——MySQL优化之索引和执行计划

    一.创建索引需要关注什么? 1.关注基数列唯一键的数量: 比如性别,该列只有男女之分,所以性别列基数是2: 2.关注选择性列唯一键与行数的比值,这个比值范围在0~1之前,值越小越好: 其实,选择性列唯 ...

  9. MySql——Explain执行计划详解

    使用explain关键字可以模拟优化器执行SQL查询语句,从而知道MySQL是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈. explain执行计划包含的信息 其中最重要的字段为:i ...

  10. [MySQL] explain执行计划解读

    Explain语法 EXPLAIN SELECT …… 变体: 1. EXPLAIN EXTENDED SELECT …… 将执行计划“反编译”成SELECT语句,运行SHOW WARNINGS 可得 ...

随机推荐

  1. 安装archlinux的另辟蹊径的命令及心得

    先说说我为什么开始入坑archlinux的吧,我最喜欢这个系统的一点就是简洁,DIY程度高,可以定制真正属于自己的专用系统.(像gentoo的话,就为了日常使用也没必要那么折腾,除非你是想在折腾的过程 ...

  2. opt目录

    在linux环境测试时,会部署到/opt目录下,这是为何呢? 下面来详解Linux的/opt目录: /opt:用户级的程序目录 这里主要存放那些可选的程序. 比如,你想部署firefox测试版,那就装 ...

  3. BeetleX.FastHttpApi之测试插件集成

    说到Webapi测试工具相信很多人想起Swagger,它可以非常方便地集成到项目中并进行项目Webapi接口测试.而BeetleX.FastHttpApi在新版本中也提供类似的插件,只需要引用这个插件 ...

  4. [android]com.android.support:appcompat-v7:XXX 包导入无法Build

    在学习<Android编程权威指南>时,按书中要求添加com.android.support:appcompat的依赖,然后编译不通过,提示如下问题: 大概意思是,Android Pie之 ...

  5. WPF转换器之值转换器

    WPF有两转转换器,一种是值转换器,另一种多值转换器,在开发过程中经常会从数据拉一些数据过来,比如存储性别的时候往往会用0或1,但在界面上肯定是要显示男或女,那么这个时候就可以用上值转换器 编写转换器 ...

  6. EPX Studio产品功能介绍

    EPX主要面向谁解决什么问题   EPX是什么? EPX基于计算机语言 EPX是利用基于Pascal的FastScript语言作为基础语言,在其中增加了许多函数与特性的一个扩展,将EPX组件本身融入到 ...

  7. 洛谷1514 引水入域 dp+记忆化搜索

    题目链接:https://www.luogu.com.cn/problem/P1514 题意大致是:给定一个(n,m)的数值矩阵,可以在第一行建造水库,如果一个格子周围的某格子值小于它,那水就可以流到 ...

  8. ML-Agents(三)3DBall例子

    ML-Agents(三)3DBall例子 前一周忙着公司的考试,都没有怎么学新的,今天补上~ 之后的记录,我准备先只研究官方的示例,主要是把研究过程中的疑惑和想法记下来.首先我先补充一下如何利用GPU ...

  9. Hive内外表的区分方法及内外部差异

    Hive内外部区分方法 查看hive元数据:进入mysql中hive元数据库,查看TBLS表,查看对应的表名和表类型: 在hive-cli界面:desc extended tablename,查看Ta ...

  10. Android LinearLayout线性布局详解

    为了更好地管理Android应用的用户界面里的各组件,Android提供了布局管理器.通过使用布局管理器,Android应用图形用户界面具有良好的平台无关性.推荐使用布局管理器来管理组件的分布.大小, ...