创新路
我们一直在努力

Mysql索引—hash和b+tree

    mysql索引是 MySQL 中一种十分重要的数据库对象,它是数据库性能调优技术的基础,常用于实现数据的快速检索。当数据量越来越庞大的时候,我们就需要使用到索引,节约数据检索时间,加快页面的响应。

    mysql的数据通常有两种访问模式,第一种是顺序访问,也叫逐行访问,也就是说从一个表中自上而下一条一条获取数据,直到获取到想要的那一条。第二种就是索引访问,就是在对应的表的数据上创建一个索引,通过这个索引,可以快速定位到想要的数据。很明显第一种访问速度效率是很低下的,但是对于一些小数据量的程序来说可能也足够了,但是对于超大数据流量的程序来说,必须使用索引访问。

    讲到这里,要提到两个关键名词,聚簇索引和非聚簇索引

    前面的文章讲过,innodb和myisam中储存数据的文件形式是不一样的,myisam中的索引是一个单独以MYI为后缀的文件单独存放的,而innodb呢则是IBD为后缀的文件同事存储索引和表数据。这就导致了myisam为存储引擎的表中,索引存储的并不是数据的本身,而是数据在表中存放的一个地址,需要再通过这个地址去存放数据的表中查找一次数据,这就是非聚簇索引。相反,innodb为存储引擎的表中,索引可能直接指向的是表数据中的主键及数据,那么就能直接拿到数据,可以不需要进行二次查找,这个就叫做聚簇索引。

    mysql中常见的两种索引结构:hash索引和b+树索引

    一、hash索引

    什么是hash索引,hash索引就是每一行数据通过精确计算产生一个hash值,索引存储的就是这一行的hash值和指向这一行的指针,可以进行快速精确匹配查找,只能支持等值操作,不能进行范围操作,也就是说不能执行类似于where id>100,只能执行where id = 100这种精确操作,还有就是数据基本上是无序排列。但是有时候还是会产生问题,比如hash冲突

    hash冲突,就是不同的索引列值有相同的hash值,那么这时候就会遍历所有链表中的行指针,来查找符合条件的数据

    例,建库建表以hash为索引

    image.png

    image.png

    image.png

    二、b+树索引

    b+树索引,叫b+tree索引,从字面意思上看就是索引是一个树形结构,是一种多路搜索树型结构。把数据分成多个区间,区间数量越多,那么检索就会越快,形成 根节点–>枝干(中间)节点–>叶子节点

    image.png

    特点:1.每一个父节点都会出现在子节点当中,并且会是子节点中最小(或者最大)的元素

             2.叶子节点,就是最下面一排,都是指针连起来的,形成一个有序链表,为顺序查询提供帮助,如查询50-60的数据,直接先查询到50的数据,然后通过链表指针直接获取到后面的数据

             3.数据都是存储在叶子节点位置的,中间(枝干)节点只负责存储多个key值,这样就大大增加了存储的数量

    优势:1.由于中间节点只存储key,那么会大大减少磁盘的IO

             2.所有的查询都会查询到叶子节点才会获得数据,大大增加了查询的稳定性(了解b-tree的童鞋应该知道b+tree稳定一些)

             3.由于叶子节点形成链表,所以顺序查询特别方便,减少每次都要遍历树的时间

             4.适合范围查询,比hash等值查询更有优势

    

未经允许不得转载:天府数据港官方信息博客 » Mysql索引—hash和b+tree

客官点个赞呗! (0)
分享到:

评论 抢沙发

评论前必须登录!

天府云博 - 做有态度的开发&运维&设计学习分享平台!

联系我们百度云主机