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. vue-element-admin 模板 登录页面 post请求通过django的csrf认证,处理304错误

    经过一天的研究,终于把 vue-admin-template 模板的 post 请求 和django的api 弄通了 没有了那该死的304报错了 直接贴代码: 在main.js中 我直接给设置了一个 ...

  2. winform不能循环引用,使用接口传值到界面

    public partial class frmMain : Form, IFormManager { 4 public frmMain() { InitializeComponent(); 8 } ...

  3. Dubbo之服务暴露

    前言 本文 Dubbo 使用版本2.7.5 Dubbo 通过使用dubbo:service配置或@service在解析完配置后进行服务暴露,供服务消费者消费. Dubbo 的服务暴露有两种: 远程暴露 ...

  4. Airtest,Poco,Unity自动化测试集成

    作为一个Game Developer,测试部分是必不可少,程序完成需求首先要进行S0相关的测试,这样确保交付到策划验收和QA验收时是没有阻断性的bug或者显而易见代码缺陷.那么如何去做测试用例呢?肯定 ...

  5. python如何通过正则表达式一次性提取到一串字符中所有的汉字

    1.python如何通过正则表达式一次性提取到一串字符中所有的汉字 https://blog.csdn.net/py0312/article/details/93999895 说明:字符串前的 “ r ...

  6. git常用命令学习配详细说明

    原文链接 把当前目录变成Git可以管理的仓库 git init 查看仓库当前的状态 git status 添加新/变动文件 git add <文件名> // 添加某个新文件(目录) git ...

  7. List集合概述和特点

    List集合概述 有序集合(也称序列)用户可以精确控制列表的每一个元素的位置插入,用户可以通过整数索引访问元素,并搜索列表中的元素 与set集合不同,列表通常允许重复的元素 List集合的特点 有序: ...

  8. payload分离免杀

    shellcode loader 借助第三方加载器,将shellcode加载到内存中来执行. https://github.com/clinicallyinane/shellcode_launcher ...

  9. cmdb客户端采集数据的完善

    file文件自己去拷贝(这里不提供) custom_settings.py import os BASEDIR = os.path.dirname(os.path.dirname(os.path.ab ...

  10. 设计模式 - 观察者模式 (C++实现)

    #include <iostream> #include <list> #include <string> using namespace std; class I ...