mysql索引

一.常见的索引类型

1.普通索引index :加速查找

2.唯一索引

    主键索引:primary key :加速查找+约束(不为空且唯一)

    唯一索引:unique:加速查找+约束 (唯一)

3.联合索引

    -primary key(id,name):联合主键索引

    -unique(id,name):联合唯一索引

    -index(id,name):联合普通索引

4.全文索引fulltext :用于搜索很长一篇文章的时候,效果最好。

二 .常见索引的数据类型

    1.hash

    hash是通过哈希算法,将索引存储指向指定的数据行,常规查询速度比较快,但是如果有比较,区间查询的就会问题

    2.Btree

    mysql中innodb用到的是B+tree,B+tree是Btree的升级版,两种数据结构都是二叉树的变种。

    区别在于Btree没个节点都会存储数据,如下图:


Btree数据结构示意图

    B+tree 非叶子节点不存储data,只存储key 叶子节点不存储指针 顺序访问指针,提高区间访问性能


B+tree数据结构示意图

三.mysql两种存储引擎的分析

1.MyISAM索引文件与数据文件是分离的,如下图


MyISAM索引结构示意图


2.InnoDB索引实现

innodb索引结构示意图

两种引擎使用的都是B+tree数据结构,不同的是MyISAM的叶子节点存储的是数据行的地址,InnoDB存储的是数据行数据,InnoDB普通索引的叶子节点存储的是行数据的主键ID,因此通过普通索引差数据会先查寻到主键索引再去主键索引树查询数据。

这里就有个数据回表的问题。数据回表是指如果查询的字段在普通索引树上存在就不用在去主键索引数查询。

索引下推 是mysql5.6以上版本新增的一个优化联合索引查询效率 减少回表次数的功能 介绍可参考:https://www.cnblogs.com/Chenjiabing/p/12600926.html

MyISAM与InnoDB比较:

1.InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;

2. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;

3. InnoDB是聚集索引,使用B+Tree作为索引结构,数据文件是和(主键)索引绑在一起的(表数据文件本身就是按B+Tree组织的一个索引结构),必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。

四.最左匹配原则

最左匹配原则都是针对联合索引来说的,

例子:假如创建一个(a,b)的联合索引,那么它的索引树是这样的

    

联合索引示意图

可以看到a的值是有顺序的,1,1,2,2,3,3,而b的值是没有顺序的1,2,1,4,1,2。所以b = 2这种查询条件没有办法利用索引,因为联合索引首先是按a排序的,b是无序的。

同时我们还可以发现在a值相等的情况下,b值又是按顺序排列的,但是这种顺序是相对的。所以最左匹配原则遇上范围查询就会停止,剩下的字段都无法使用索引。例如a = 1 and b = 2 a,b字段都可以使用索引,因为在a值确定的情况下b是相对有序的,而a>1and b=2,a字段可以匹配上索引,但b值不可以,因为a的值是一个范围,在这个范围中b是无序的。

分析语句

 select * table where a=1 and b=2 可以使用索引

 select * table where a=1 可以使用索引

select * table where a>1 and b=2 a字段可以匹配上索引,但b值不可以,

select * table where b=2 and a=1 可以使用索引


sql查询过程示意图

你可能感兴趣的:(mysql索引)