美文网首页
mysql索引

mysql索引

作者: 譬如朝潞 | 来源:发表于2021-11-02 09:59 被阅读0次

一.常见的索引类型

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索引及查询优化书目录

    MySQL索引的原理之索引目的 MySQL索引的原理之索引原理 MySQL索引的原理之索引的类型 MySQL索引的...

  • 高性能的索引策略

    MySQL查询基础-查询执行过程 MySQL聚簇索引 MySQL覆盖索引 MySQL索引扫描排序 MySQL冗余和...

  • MySQL索引的使用

    MySQL索引 MySQL索引可以快速提高MySQL的检索速度。索引分单列索引和组合索引单列索引:即一个索引只包含...

  • Mysql索引与锁

    本文以Mysql5.7为例测试。 1:mysql索引方法 Mysql的索引方法分为btree索引和hash索引。 ...

  • 索引(二)

    mysql索引的新手入门详解mysql索引之三:索引使用注意规则 索引(Index)是帮助 MySQL 高效获取数...

  • MySQL 索引分类

    MySQL索引的分类(根据数据结构) 索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL...

  • MySQL--索引

    MySQL索引 查看索引 创建索引 创建唯一索引 创建主键索引 删除索引 删除主键 MySQL视图 创建视图 删除...

  • mysql索引

    索引 mysql索引的建立对于mysql的高效运行是很重要的,索引可以大大提高mysql的检索速度。索引分单列索引...

  • 5.2MySQL创建高性能索引考察点

    MySQL索引的基础和类型延伸:MySQL索引的创建原则延伸:MySQL索引的注意事项 索引的基础索引类似于书籍的...

  • MySql 数据查询优化

    1. MySQL索引类型: mysql的索引有5种:主键索引、普通索引、唯一索引、全文索引、聚合索引(多列索引)。...

网友评论

      本文标题:mysql索引

      本文链接:https://www.haomeiwen.com/subject/lecialtx.html