mysql索引底层原理

1 概念:索引在MySQL中也叫是一种“键”,是存储引擎用于快速找到记录的一种数据结构。
      

2 原理及分类:
     索引的目的在于提高查询效率,与我们查阅图书所用的目录是一个道理:
     先定位到章,然后定位到该章下的一个小节,然后找到页数。

   索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址,
     
    使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。

优势:可以快速检索,减少I/O次数,加快检索速度;根据索引分组和排序,可以加快分组和排序;

劣势:1 索引本身也是表,因此会占用存储空间,一般来说,索引表占用的空间的数据表的1.5倍;

           2 索引表的维护和创建需要时间成本,这个成本随着数据量增大而增大;

           3 构建索引会降低数据表的修改操作(删除,添加,修改)的效率,因为在修改数据表的同时还需要修改索引表;

 

InnoDB索引实现:

     表数据本身就是按B+Tree组织的一个索引结构文件

      而聚集索引(idb主键索引):叶子节点包含完整的数据记录(节点数据限制保护内存消耗)即所有字段值

      idb文件包含表的数据和索引      frm文件存储  表结构的信息数据   (1170个key每页1000个数据)

为什么必须有主键,为何整型递增?隐藏的主键是一个6个字节的列,该列的值会随着数据的插入自增

      mysql的底层是以b+tree实现的,数据记录本身被存于主索引(一颗B+Tree)的叶子节点上。

      同一个叶子节点内(大小为一个内存页或磁盘页)的各条数据记录按主键顺序存放,MySQL会根据其主键

      将其插入适当的节点和位置,如果页面达到装载因子(InnoDB默认为15/16),则开辟一个新的页(节点)

      整型是为了便于顺序查询以及范围查询。如果使用uuid字符串范围比较查询消耗大,存储空间也大(比较又需要asii转化)

      对于自身便于做分页以及顺序存放,顺序访问指针提高区间的访问性能(叶子节点存所有字段)

      自增ID可以用来做分页优化。如下语句性能相差1000倍:

         1. Select * from tbl limit 10000000,30;

         2. Select * from tbl where id>10000000 limit 30;

   Myslam索引  数据文件和索引文件分离 (非聚集索引)

          myi(index)文件 索引字段存储数据     myd文件;表数据    frm表结构定义数据

          叶子节点  主键索引存储磁盘文件指针data

磁盘存储原理:寻道时间长,旋转时间短

MySQL支持诸多存储引擎,而存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,B+Tree索引,哈希索引,全文索引等等,

1、哈希索引
只有memory(内存)存储引擎支持哈希索引,哈希索引用索引列的值计算该值的hashCode,然后在hashCode相应的位置存执该值所在行数据的物理位置,因为使用散列算法,因此访问速度非常快,但是一个值只能对应一个hashCode,而且是散列的分布方式,因此哈希索引不支持范围查找和排序的功能

2、全文索引
FULLTEXT(全文)索引,仅可用于MyISAM和InnoDB,针对较大的数据,生成全文索引非常的消耗时间和空间。对于文本的大对象,或者较大的CHAR类型的数据,如果使用普通索引,那么匹配文本前几个字符还是可行的,但是想要匹配文本中间的几个单词,那么就要使用LIKE %word%来匹配,这样需要很长的时间来处理,响应时间会大大增加,这种情况,就可使用时FULLTEXT索引了,在生成FULLTEXT索引时,会为文本生成一份单词的清单,在索引时及根据这个单词的清单来索引。FULLTEXT可以在创建表的时候创建,也可以在需要的时候用ALTER或者CREATE INDEX来添加:

3、BTree索引

  BTree是平衡搜索多叉树,设树的度为2d(d>1),高度为h,那么BTree要满足以一下条件:

每个叶子结点的高度一样,等于h;
每个非叶子结点由n-1个key和n个指针point组成,其中d<=n<=2d,key和point相互间隔,结点两端一定是key;
叶子结点指针都为null;从左向右递增
非叶子结点的key都是[key,data]二元组,其中key表示作为索引的键,data为键值所在行的磁盘文件指针;


4、B+Tree索引

     B+Tree是BTree的一个变种

    B+Tree中的非叶子结点不存data,只存储键值key;可以增大度(节点数据存储个数)
    B+Tree所有键值都会出现在叶子结点上,且key存储的键值对应data数据的物理地址
    B+Tree的叶节点具有相同高度,顺序访问指针,提高区间访问的性能
 

提升查找速度的关键就在于尽可能少的磁盘I/O,那么可以知道,每个节点中的key个数越多,那么树的高度越小,需要I/O的次数越少,因此一般来说B+Tree比BTree更快,因为B+Tree的非叶节点中不存储data,就可以存储更多的key

储引擎在B+Tree的基础上进行了优化,添加了指向相邻叶节点的指针,形成了带有顺序访问指针的B+Tree,这样做是为了提高区间查找的效率,只要找到第一个值那么就可以顺序的查找后面的值

 

https://blog.csdn.net/tongdanping/article/details/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

**星光*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值