Mysql索引实现:

B-tree,B是balance,一般用于数据库的索引。使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度。而B+tree是B-tree的一个变种,MySQL就普遍使用B+tree实现其索引结构。

一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。

为了达到这个目的,磁盘按需读取,要求每次都会预读的长度一般为页的整数倍。而且数据库系统将一个节点的大小设为等于一个页,这样每个节点只需要一次I/O就可以完全载入。每次新建节点时,直接申请一个页的空间,这样就保证一个节点物理上也存储在一个页里,加之计算机存储分配都是按页对齐的,就实现了一个node只需一次I/O。并把B-tree中的m值设的非常大,就会让树的高度降低,有利于一次完全载入

B-Way查找树:

一棵树的每个节点的度小于等于m。

每个节点的键值数小于m每个节点的度小于等于m键值按顺序排列子树的键值要完全小于或大于或介于父节点之间的键值

B-Tree树:

B-tree又叫平衡多路查找树。一棵m阶的B-tree (m叉树)的特性如下:

(其中ceil(x)是一个取上限的函数)

1) 树中每个结点至多有m个孩子;

2) 除根结点和叶子结点外,其它每个结点至少有有ceil(m / 2)个孩子;

3) 若根结点不是叶子结点,则至少有2个孩子(特殊情况:没有孩子的根结点,即根结点为叶子结点,整棵树只有一个根节点);

4) 所有叶子结点都出现在同一层,叶子结点不包含任何关键字信息(可以看做是外部结点或查询失败的结点,实际上这些结点不存在,指向这些结点的指针都为null);

5) 每个非终端结点中包含有n个关键字信息: (n,P0,K1,P1,K2,P2,......,Kn,Pn)。其中:

a) Ki (i=1...n)为关键字,且关键字按顺序排序K(i-1)< Ki。

b) Pi为指向子树根的接点,且指针P(i-1)指向子树种所有结点的关键字均小于Ki,但都大于K(i-1)。

c) 关键字的个数n必须满足: ceil(m / 2)-1 <= n <= m-1。

B+Tree树:

B+树是B-树的变体。

有几点不同的地方:

非叶子结点的子树指针与关键字个数相同

为所有叶子结点增加一个链指针

所有关键字都在叶子结点出现

二、聚集索引, 非聚集索引

聚集索引:

该索引中键值的逻辑顺序决定了表中相应行的物理顺序。

聚集索引确定表中数据的物理顺序。聚集索引类似于电话簿,后者按姓氏排列数据。由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引。但该索引可以包含多个列(组合索引),就像电话簿按姓氏和名字进行组织一样。

非聚集索引:

该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同。

索引是通过二叉树的数据结构来描述的,我们可以这么理解聚簇索引:索引的叶节点就是数据节点。而非聚簇索引的叶节点仍然是索引节点,只不过有一个指针指向对应的数据块。如下图:

mysql索引 聚集索引_Mysql 索引实现原理. 聚集索引, 非聚集索引相关推荐

  1. mysql 缓存监控_MySql 缓存查询原理与缓存监控 和 索引监控

    MySql缓存查询原理与缓存监控 And 索引监控 by:授客 QQ:1033553122 查询缓存 1.查询缓存操作原理 mysql执行查询语句之前,把查询语句同查询缓存中的语句进行比较,且是按字节 ...

  2. SQL Server 解读【已分区索引的特殊指导原则】(3) - 非聚集索引分区

    一.前言 在MSDN上看到一篇关于SQL Server 表分区的文档:已分区索引的特殊指导原则,如果你对表分区没有实战经验的话是比较难理解文档里面描述的意思.这里我就里面的一些概念进行讲解,方便大家的 ...

  3. mysql数据库复制基本原理_MySQL的复制原理以及流程

    原创文章出自公众号:「码农富哥」,如需转载请注明出处! 文章如果对你有收获,可以收藏转发,这会给我一个大大鼓励哟!另外可以关注我公众号「码农富哥」 (搜索id:coder2025),我会持续输出Pyt ...

  4. mysql唯一索引一个表_mysql一个表可以有几个唯一索引?

    匿名用户 1级 2017-12-01 回答 创建唯一索引的目的不是为了提高访问速度,而只是为了避免数据出现重复.唯一索引可以有多个但索引列的值必须唯一,索引列的值允许有空值.如果能确定某个数据列将只包 ...

  5. mysql xtrabackup 保护模式_MySQL Xtrabackup备份原理和实现细节

    备份原理: XtraBackup基于InnoDB的crash-recovery功能.它会复制innodb的data file,由于不锁表,复制出来的数据是不一致的,在恢复的时候使用crash-reco ...

  6. mysql 自定义函数实例_mysql自定义函数原理与用法实例分析

    本文实例讲述了mysql自定义函数原理与用法.分享给大家供大家参考,具体如下: 本文内容: 什么是函数 函数的创建 函数的调用 函数的查看 函数的修改 函数的删除 首发日期:2018-04-18 什么 ...

  7. 给mysql数据库设计编码_MYSQL数据库编码原理

    很多站长可能与织梦CMS小编一样,觉得MYSQL数据库即熟悉又神秘.熟悉是因为我们每天都会用到MYSQL进行安装织梦程序,陌生是因为mysql经常与linux联系,是基于linux系统的下的应用,而我 ...

  8. mysql 子查询代替_MySQL查询优化:用子查询代替非主键连接查询

    一对多的两张表,一般是一张表的外键关联到另一个表的主键.但也有不一般的情况,也就是两个表并非通过其中一个表的主键关联. 一对多的两张表,一般是一张表的外键关联到另一个表的主键.但也有不一般的情况,也就 ...

  9. mysql索引底层图_MySQL索引底层数据结构

    一.何为索引? 1.索引是帮助数据库高效获取数据的排好序的数据结构. 2.索引存储在文件中. 3.索引建多了会影响增删改效率.(一张表最多允许建16个索引) (下面这张图为计算机组成原理内容,每查询一 ...

  10. 【MySQL】MySQL的存储引擎和索引详解(聚集索引和非聚集索引)

    目录 一.MySQL存储引擎 1.1  Innodb引擎 1.2 MyISAM引擎 1.3 InNoDB与MyISAM异同 1.4 两种引擎的选择 二.索引(Index) 2.1 InnoDB存储引擎 ...

最新文章

  1. win7下计划任务schtasks使用详解及错误:无法加载列资源的解决方法1
  2. 干货 | 如何系统学习 C 语言?
  3. 中国经济转型知易行难
  4. druid seata 配置_架构设计 | 基于Seata中间件,微服务模式下事务管理
  5. mysql安装及一些注意点
  6. python和pycharm要安装在同一个路径下吗_无法在pyCharm中导入与Anaconda一起安装的文件:需要将Anaconda添加到Python路径吗?...
  7. 10进制小数转化为任意进制小数
  8. .net Remoting(1)——起点,从示例做起
  9. python使用-Python 应该怎么去练习和使用?
  10. mac允许安装未知来源_macOS 10.13及以上版本安装允许任何来源没了怎么开启?
  11. 编译安装LAMP平台
  12. linux菜鸟要飞-根目录
  13. Android NFC详解
  14. 闭关修炼,看了老大的博客,才发现自己是多么的技术低,原来我就达到06年的他...
  15. 台式计算机拆解与安装,台式机固态硬盘安装流程拆解
  16. 笑话--老外与山东妞(爆笑)
  17. 逻辑漏洞之密码找回漏洞(semcms)
  18. HNU软件能力实训2-17. 小A的计算器
  19. 图片头顶距离顶部百分比怎么修改_ps如何修改图片文字 ps怎么修改文字
  20. 多功能拓展坞设计CS5266|CapstoneCS5266带PD多合一拓展坞方案电路|CS5266方案电路图

热门文章

  1. nginx index.php 端口,nginx-如果index.php不在nginx文件夹中,则禁止使用php fpm
  2. java程序的最小程序单位_微信小程序中rpx与rem单位使用
  3. jQuery效果之滑动
  4. 1.Hadoop的学习(Linux的基础命令)
  5. String 重载 + 原理分析
  6. wxWidgets:wxScrolled< T >类模板的用法
  7. boost::spirit模块实现使用迭代器位置注释 AST的测试程序
  8. boost::math::skew_normal用法的测试程序
  9. boost::hana::if_用法的测试程序
  10. boost:验证Boost的BOOST_CLASS_REQUIRE宏