索引的作用是提高查询效率,其实现方式有很多种,常见的索引模型有哈希表、有序列表、搜索树等。

哈希表

  • 一种以key-value键值对的方式存储数据的结构,通过指定的key可以找到对应的value。
  • 哈希把值放在数组里,用一个哈希函数把key换算成一个确定位置,然后把value放在数组的这个位置。但是,多个key值经过哈希函数的换算,可能会出现同一个值,即哈希冲突,常见的解决办法是链地址法,即将所有的相同Hash值的key放在一个链表中,这样,无论有多少个冲突,都只是在当前位置给单链表增加节点。
  • 适用于只有等值查询的场景,区间查询会很慢。

有序列表

  • 支持等值查询和范围查询,但是更新数据的成本比较高。
  • 适用于静态存储索引,比如保存的是2017年某个城市人口信息这类不会修改的数据。

1.二叉树:
  • 每个节点的左儿子小于父节点,父节点小于右儿子。
  • 查找、更新某个节点的时间复杂度都是O(log(N)),搜索效率最高。

    2.B树(多叉树):

    根节点至少有两个子节点,每个节点的子节点间,其大小都是从左到右递增。

3.B+树:
  • B+树的叶子节点保存了父节点的所有键值和键值对应的数据,每个叶子节点的键值从小到大链接,但非叶子节点不保存键值对应的数据,这样使得B+树每个节点所能保存的键值大大增加;
  • 由于B+树的非叶子节点只进行数据索引,不会存实际的键值对应的数据,所有的数据必须到叶子节点才能获取到,所以每次数据查询的次数都一样。

因为索引不止存在内存中,还要写在磁盘上,为了尽量少地读写磁盘,减少IO次数,所以尽管二叉树的效率很高,大多数数据库不会选择二叉树,InnoDB使用B+树索引模型,所有数据都存储在B+树中,每一个索引对应一棵B+树。

结论:InnoDB采用B+树结构,是因为B+树能够很好地配合磁盘的读写特性,减少单次查询的磁盘访问次数,降低IO、提升性能。

《MySQL实战45讲》学习笔记3——InnoDB为什么采用B+树结构实现索引的更多相关文章

  1. MySQL实战45讲学习笔记:第三十九讲

    一.本节概况 MySQL实战45讲学习笔记:自增主键为什么不是连续的?(第39讲) 在第 4 篇文章中,我们提到过自增主键,由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧 ...

  2. 深挖计算机基础:MySQL实战45讲学习笔记

    参考极客时间专栏<MySQL实战45讲>学习笔记 一.基础篇(8讲) MySQL实战45讲学习笔记:第一讲 MySQL实战45讲学习笔记:第二讲 MySQL实战45讲学习笔记:第三讲 My ...

  3. MySQL实战45讲学习笔记:第十五讲

    一.引子 在今天这篇答疑文章更新前,MySQL 实战这个专栏已经更新了 14 篇.在这些文章中,大家在评论区留下了很多高质量的留言.现在,每篇文章的评论区都有热心的同学帮忙总结文章知识点,也有不少同学 ...

  4. MySQL实战45讲学习笔记:事务隔离级别(第三讲)

    一.隔离性与隔离级别 1.事务的特性 原子性 一致性 隔离性 持久性 2.不同事务隔离级别的区别 读未提交:别人改数据的事务尚未提交,我在我的事务中也能读到.读已提交:别人改数据的事务已经提交,我在我 ...

  5. MySQL实战45讲学习笔记:第二十四讲

    一.引子 在前面的文章中,我不止一次地和你提到了 binlog,大家知道 binlog 可以用来归档,也可以用来做主备同步,但它的内容是什么样的呢?为什么备库执行了 binlog 就可以跟主库保持一致 ...

  6. MySQL实战45讲学习笔记:第四十四讲

    一.引子 这是我们专栏的最后一篇答疑文章,今天我们来说说一些好问题. 在我看来,能够帮我们扩展一个逻辑的边界的问题,就是好问题.因为通过解决这样的问题,能够加深我们对这个逻辑的理解,或者帮我们关联到另 ...

  7. MySQL实战45讲学习笔记:第十六讲

    一.今日内容概要 在你开发应用的时候,一定会经常碰到需要根据指定的字段排序来显示结果的需求.还是以我们前面举例用过的市民表为例,假设你要查询城市是“杭州”的所有人名字,并且按照姓名排序返回前 1000 ...

  8. MySQL实战45讲学习笔记:第十九讲

    一.引子 一般情况下,如果我跟你说查询性能优化,你首先会想到一些复杂的语句,想到查询需要返回大量的数据.但有些情况下,“查一行”,也会执行得特别慢.今天,我就跟你聊聊这个有趣的话题,看看什么情况下,会 ...

  9. MySQL实战45讲学习笔记:第四十五讲

    一.本节概述 MySQL 里有很多自增的 id,每个自增 id 都是定义了初始值,然后不停地往上加步长.虽然自然数是没有上限的,但是在计算机里,只要定义了表示这个数的字节长度,那它就有上限.比如,无符 ...

随机推荐

  1. FTP工具-FileZilla安装使用教程

    1.首先,百度搜索“FileZilla”,进入官网,下载地址:https://www.filezilla.cn/download/client  ,根据自己电脑配置去下载 2.下载本地,双击运行安装程 ...

  2. Mysql 分页order by一个相同字段,发现顺序错乱

    两次分页查询,其中跳过了2个id   select * from jdp_tb_trade  where jdp_modified>='2017-04-24 20:22:01' and jdp_ ...

  3. 调用百度翻译 API 来翻译网站信息

    之前说过jquery.i18n.js 来做网站的中英翻译,前提就得做一套中文内容,一套英文内容来解决,好处是中英翻译可以准确无误,本篇文章我们来看一下调用百度翻译的 API 来进行网站的翻译,但是翻译 ...

  4. 100天搞定机器学习|day40-42 Tensorflow Keras识别猫狗

    100天搞定机器学习|1-38天 100天搞定机器学习|day39 Tensorflow Keras手写数字识别 前文我们用keras的Sequential 模型实现mnist手写数字识别,准确率0. ...

  5. Redis 5.0.5集群搭建

    Redis 5.0.5集群搭建 一.概述 Redis3.0版本之后支持Cluster. 1.1.redis cluster的现状 目前redis支持的cluster特性: 1):节点自动发现 2):s ...

  6. 线程的start方法解析

    Thread是学习我们学习多线程接触到的第一个有关多线程的类,相信每一个学习过或者了解过Java多线程的小伙伴都知道Thread类.这次分享主要对Thread的start方法进行讲解. 相信大家都知道 ...

  7. Linux x86和x64的区别

    0x01:寄存器分配的不同 (1)64位有16个寄存器,32位只有8个.但是32位前8个都有不同的命名,分别是e _ ,而64位前8个使用了r代替e,也就是r _.e开头的寄存器命名依然可以直接运用于 ...

  8. mongo常用语法

    首先要能进入控制台,进不去自己解决. 基本操作: show users:显示用户 show dbs:显示数据库列表 use <db name> 切换/创建数据库 show collecti ...

  9. win server 2008搭建域环境

    0x00 简介 1.域控:win server 2008 2.域内服务器:win server 2008.win server 2003 3.域内PC:win7 x64.win7 x32.win xp ...

  10. eclipse导入的web项目不能部署到tomcat,显示为java项目

    今天在eclipse中导入之前做个项目,想运行起来看看,发现导入之后没法部署. 先解决办法如下: 右键项目 勾选上面三项并选择相应的值后就变成web项目,可以部署在tomcat上了.