Mysql InnoDb索引以及算法

索引以及算法

1、简介

InnoDB存储引擎支持一下几种索引:

  • B+树索引
  • 全文索引
  • 哈希索引

B+树就是常规意义的索引,不是二叉树,而是balance树。B+索引常常被误解的是,通过B+索引只能找到被查找数据所在的数据页。然后在内存中查找对应的数据。

2、数据结构和算法

2.1、二分查找法

 数据页中就是按照二分查找来进行具体数据的查找。

3.1、B+树结构

三种插入方式

例子展示三种插入方式:

插入28,leaf page、index page都没有满,直接插入即可

 插入70这个元素,leaf page满了,index page没有满。

插入leaf page的情况应该为 50、55、80、65、70,中间元素为60,将60放入大index page

然后插入95,这个时候leaf page和index page都满了,这个时候满足第三种情况。

首先leaf page变成:75、80、85、90、95,中间元素为85,将85放到index page,leaf page变成 【75、80】、【85、90、95】

index page变成:25、50、60、75、85,中间元素为60,将index page拆分为【25、50】、【75、85】

 3.2 B+树索引分类

  • 聚集索引:叶子节点存放一整行数据
  • 辅助索引:方便提高查询效率的索引

聚集索引只能有一个,查询优化器多数情况采用聚集索引

3.2.2 辅助索引

辅助索引也叫做非聚集索引

是不是应该加某个字段的非聚集索引

区分度越大越应该加索引,如果所有记录某个字段只有几个值,加索引的意义就很低。

具体的公式

show index from t_opp_info;  

查看表中索引的情况,关键关注cardinality

 公式为var = cardinality/总记录数量,var越接近1,索引的作用越大。

3.2.3 联合索引的用法

index a,bc

index a

select * from t where a = ''会使用索引a

select * from t where a= '' and b = '' 会使用索引abc

select * from t where a= '' and b = '' and c= '' 会使用索引abc

select * from t where a= '' order by b 会使用索引abc

select * from t where a= '' order by b,c 会使用索引abc

select * from t where a= '' order by c 不是使用索引

因为索引abc会把数据按照abc的方式去排序

3.2.4 覆盖索引 

覆盖索引指的是引擎不需要回聚集索引去查全部数据,仅仅在索引的二叉树上就可以查出来需要的数据,不需要回表。

3.2.5 索引不生效的情况

3.2.6 哈希算法 

适合那些热数据,不可能把全表都放到缓存中。

select * from t where name = '张三'

hash(‘张三’)=003,然后从索引表的开始遍历,3次后找到hash相等的,hash值后面跟着记录所在的位置。但是该位置上可能有多条数据,这个时候遍历查找符合的元素。

原文地址:https://www.cnblogs.com/zhangchiblog/p/14060953.html