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. MyISAM 和 InnoDB

    1.MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调的是性能,其执行数度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级 ...

  2. 个人项目作业(wc.exe)

    1.GitHub项目地址 https://github.com/QiuBin666/WC 项目介绍: 题目描述 Word Count1. 实现一个简单而完整的软件工具(源程序特征统计程序).2. 进行 ...

  3. OpenMP Programming

    一.OpenMP概述 1.OpenMP应用编程接口API是在共享存储体系结构上的一个编程模型 2.包含 编译制导(compiler directive).运行库例程(runtime library). ...

  4. Docker深入浅出系列 | Swarm多节点实战

    目录 前期准备 Swarm基本概念 什么是Docker Swarm 为什么要用Swarm Swarm的网络模型 Swarm的核心实现机制 服务发现机制 负载均衡机制Routing Mesh Docke ...

  5. java第一次上机练习作业

    1.已知a,b均是整型变量,写出将a,b两个变量中的值互换的程序.(知识点:变量和 运算符综合应用) int a = 5, b = 10; int temp; temp = a; a = b; b = ...

  6. EPX-Studio调用Dll模块

    procedure TForm1.BitBtn1Click(Sender: TObject); var REP : IExcelPanelXDisp; modulePath:string; begin ...

  7. php 调用curl_init失败

    当你在开发微信公众号,微信小程序的时候,往往会遇到困难 进入服务器,输入 tail -f /var/log/apache2/error.log 看看apache2的日志 就因为php 的curl扩展没 ...

  8. Django redis的使用

    一 简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted ...

  9. fastText 训练和使用

    2019-09-09 16:33:11 问题描述:fastText是如何进行文本分类的. 问题求解: fastText是一种Facebook AI Research在16年开源的一个文本分类器. 其特 ...

  10. Contest 157

    2019-10-06 12:15:28 总体感受:总体难度一般,dfs和dp题花了点时间,最后一题dp有思路,但是实现上不够好. 注意点:首先是hard问题的覆盖度依然是很大的问题,其次是要注意审题. ...