MYSQL索引

索引的本质

索引是帮助Mysql高效获取数据的排好序的数据结构。

索引数据结构:
1、二叉树
2、红黑树
3、Hash表
4、B-Tree

无索引:
查找 col2=89的数据,会进行全表扫描,从第一个开始往下面扫描,直到找到col2=89为止,需要查找至少6次。

select * from t where t.col2=89;
1
有索引(二叉树):
如图右侧所画,二叉树的规则是左边小,右边大。将所有的值按照二叉树数据结构排列,当查找col2=89时:从根节点,找89,比34大,找右侧。找两次就找到了。
但是,MySQL里面并不是使用的二叉树,因为当以自增主键为索引时,建成的二叉树其实和主键索引没什么区别,因为自增会一直往二叉树的右侧去增加,最终形成的是一条链表,不能起到二叉树的效果。如图:

红黑树

当索引递增增长的话,不会单边的一直增长,会有一个平衡的工程,不至于像上面的二叉树那样一边倒的状况出现。
但是,MySQL里面并不是使用的红黑树,因为当数量很大的售后,树的层数太多了。 

 

B+Trees树 

在这里插入图片描述 

 MYSQL默认引擎InnoDB使用的就是B+tree树结构

一.索引的类型与常见的操作

前缀索引 MySQL 前缀索引能有效减小索引文件的大小,提高索引的速度。但是前缀索引也有它的坏处:MySQL 不能在 ORDER BY 或 GROUP BY 中使用前缀索引,也不能把它们用作覆盖索引(Covering Index)。

复合索引 集一个索引包含多个列(最左前缀匹配原则)

唯一索引 索引列的值必须唯一,但允许有空值

全文索引 在MySQL 5.6版本以前,只有MyISAM存储引擎支持全文引擎.在5.6版本中,InnoDB加入了对全文索引的支持,但是不支持中文全文索引.在5.7.6版本,MySQL内置了ngram全文解析器,用来支持亚洲语种的分词. 全文索引为FUllText,在定义索引的列上支持值的全文查找,允许在这些索引列中插入重复值和空值,全文索引可以在CHAR,VARCHAR,TEXT类型列上创建

主键索引 设定主键后数据会自动建立索引,InnoDB为聚簇索引

单列索引 即一个索引只包含单个列,一个表可以有多个单列索引

覆盖索引 覆盖索引是指一个查询语句的执行只用从所有就能够得到,不必从数据表中读取,覆盖索引不是索引树,是一个结果,当一条查询语句符合覆盖索引条件时候,MySQL只需要通过索引就可以返回查询所需要的数据,这样避免了查到索引后的回表操作,减少了I/O效率

-- 目前有一个key(name)索引,聚簇索引是key(id)

-- 使用了覆盖索引

select id from stu where key = '张三';

-- 不使用覆盖索引,因为查询的结果无法从普通索引树中得到,需要回表查询

select * from stu where key = '张三'

聚簇索引和非聚簇索引

聚簇索引:将数据存储和索引放到了一块,索引结构的叶子结点保存了行数据

非聚簇索引:将数据与索引分开存储,索引结构的叶子结点指向主键的值,也就是对应的聚簇索引的row id(需要查找两个B+tree,这个操作过程叫做回表)。

InnoDB中主键索引一定是聚簇索引,聚簇索引一定是主键索引。
 

什么情况下无法使用索引

查询语句中使用Like关键字 在查询语句中使用LIke关键字进行查询时,如果匹配字符串的第一个字符为"%",索引不会使用。如果“%”不是在第一位,索引就会使用

查询语句中使用多列索引 多列索引是在表的多个字段上创建的索引,满足最左前缀匹配原则,索引才会被使用

查询语句中使用OR关键字 查询语句只有Or关键字时候,如果OR前后的两个条件都是索引,这这次查询将会使用索引,否则Or前后有一个条件的列不是索引,那么查询中将不使用索引
 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值