Mysql索引结构以优化

  • InnoDB索引数据类型结构
    Mysql索引结构以优化_第1张图片
    通常在B+Tree上有两个头指针,一个指向根节点,另一个指向关键字最小的叶子节点,而且所有叶子节点(即数据节点)之间是一种链式环结构。因此可以对B+Tree进行两种查找运算:一种是对于主键的范围查找和分页查找,另一种是从根节点开始,进行随机查找。

下面做一个推算:

InnoDB存储引擎中页的大小为16KB,一般表的主键类型为INT(占用4个字节)或BIGINT(占用8个字节),指针类型也一般为4或8个字节,也就是说一个页(B+Tree中的一个节点)中大概存储16KB/(8B+8B)=1K个键值(因为是估值,为方便计算,这里的K取值为〖10〗3)。也就是说一个深度为3的B+Tree索引可以维护103 * 10^3 * 10^3 = 10亿 条记录。

  • 聚合索引和非聚合索引
    聚集索引:以表主键(若无主键的时候以唯一索引、无唯一索引按rowId)为序,建立一个B+tree数据结构,行全量数据则存放在叶子节点上。
    非聚集索引:以索引列建立一个B+tree数据结构,和聚集索引不一样的地方是叶子节点存放的并不是行全量数据,而是聚集索引的主键。通过聚集索引的主键在找到全量数据
  • 回表
    当我们使用select * 的时候where条件中有非聚集索引,那这个时候可能会回表,回表的具体含义是,查询了非聚集索引,但是select 后面查询的数据在非聚集索引中叶子节点中不存在,必须通过主键索引去查询。这个时候会走两次B+tree的索引结构(一次找到数据ID,一次根据数据ID去找查询 的数据)。这种情况叫回表
  • 覆盖索引
    如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’。即只需扫描索引而无须回表。
  • 索引优化器
    会对我们的sql进行下优化,使得Mysql更好的使用索引,从而更好的节省时间和提升效率。
    具体优化点:等价变化规则、基于联合索引,调整条件位置等、优化count 、min、max等函数、将可转换的外连接查询转换为内连接查询、覆盖索引扫描、子查询优化、外连接转换为内连接、提前终止查询、IN的优化。
  • 索引之explain
    在这里插入图片描述
id
id列表示select查询的序列号,标识执行的顺序

  1、id相同,执行顺序由上至下

  2、id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

  3、id相同又不同即两种情况同时存在,id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越先执行。上图示例中执行顺序为3->1->2。

select_type
  select_type表示查询的类型,主要是用于区分普通查询、联合查询、子查询等。

 - SIMPLE:简单的select查询,查询中不包含子查询或者union
 - PRIMARY:说明查询中包含子部分,其最外层查询则被标记为primary
 - SUBQUERY/MATERIALIZED:SUBQUERY表示在select或where列表中包含了子查询,MATERIALIZED表示where 后面in条件的子查询
 - UNION:若第二个select出现在union之后,则被标记为union;
 - UNION RESULT:从union表获取结果的的select
table
  table表示查询涉及到的表,直接显示表名或者表的别名,如果不是直接显示表名,如下:

   由ID为M,N 查询union产生的结果
   由ID为N查询生产的结果
type
   type表示访问类型,sql查询优化中一个很重要的指标,结果值从好到坏依次是:

  system > const > eq_ref > ref > range > index > ALL
  system:表只有一行记录(等于系统表),const类型的特例,基本不会出现,可以忽略;
 
const:表示通过索引一次就找到了,const用于primary key或者unique索引,
       一般只有主键索引才会const,因为其他索引都要进行二次回表;
 
eq_ref:唯一索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描,
        一般为唯一索引,因为要进行回表,所以达不到const级别;
 
ref:非唯一性索引扫描,返回匹配某个单独值的所有行,本质是也是一种索引访问;
 
range:只检索给定范围的行,使用一个索引来选择行,例如where time>? and time

你可能感兴趣的:(mysql)