一、‘页’和操作系统的关系

①为什么要有内存管理?

我们知道,一个进程完成他的功能,需要访问磁盘加载数据到内存然后等待进入cpu运算,因为数据量大小远远大于内存大小。因此提出虚拟内存概念。虚拟内存就是将程序用到的数据进行划分,暂时用不到的放到磁盘里,用到的放到内存里,操作系统中总是运行着不止一个进程,各个进程有优先级顺序,所以存在进程调度问题,进程的每次调度都会导致内存和磁盘数据置换,段式内存管理页式内存管理都是基于虚拟内存概念的具体内存管理解决方案。

②什么是页式内存管理?

虚拟内存位于程序和物理内存之间,程序只能看见虚拟内存,再也不能直接访问物理内存。每个程序都有自己独立的进程地址空间,这样就做到了进程隔离。这里的进程地址空间是指虚拟地址。顾名思义,既然是虚拟地址,也就是虚的,不是现实存在的地址空间。既然我们在程序和物理地址空间之间增加了虚拟地址,那么就要解决怎么从虚拟地址映射到物理地址,因为程序最终肯定是运行在物理内存中的,主要有分段和分页两种技术。

分页机制就是把内存地址空间分为若干个很小的固定大小的页,每一页的大小由内存决定,就像Linux中ext文件系统将磁盘分成若干个Block一样,这样做是分别是为了提高内存和磁盘的利用率。

③页的大小为什么是4K?

CPU位数准确地说应该是CPU一次能够并行处理的数据宽度,一般就是指数据总线宽度。(后续补充:参考http://blog.sina.com.cn/s/blog_b4ef897e0102vfw5.html)

④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值设的非常大,就会让树的高度降低,有利于一次完全载入。

二、聚簇索引和非聚簇索引

①mysql索引

B+Tree结构都可以用在MyISAM和InnoDB上。mysql中,不同的存储引擎对索引的实现方式不同,大致说下MyISAM和InnoDB两种存储引擎。
MyISAM的是非聚簇索引,B+Tree的叶子节点上的data,并不是数据本身,而是数据存放的地址。主索引和辅助索引没啥区别,只是主索引中的key一定得是唯一的。这里的索引都是非聚簇索引。非聚簇索引的两棵B+树看上去没什么不同,节点的结构完全一致只是存储的内容不同而已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。表数据存储在独立的地方,
这两颗B+树的叶子节点都使用一个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独立的,通过辅助键检索无需访问主键的索引树。InnoDB的数据文件本身就是索引文件,B+Tree的叶子节点上的data就是数据本身,key为主键,这是聚簇索引。聚簇索引,叶子节点上的data是主键(所以聚簇索引的key,不能过长)。
InnoDB使用的是聚簇索引,将主键组织到一棵B+树中,而行数据就储存在叶子节点上,若使用"where id = 14"这样的条件查找主键,则按照B+树的检索算法即可查找到对应的叶节点,之后获得行数据。若对Name列进行条件搜索,则需要两个步骤:第一步在辅助索引B+树中检索Name,到达其叶子节点获取对应的主键。第二步使用主键在主索引B+树种再执行一次B+树检索操作,最终到达叶子节点即可获取整行数据。
B+Tr ee示意图
聚集索引和非聚集索引原理图

②聚簇索引

聚簇索引的数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的。聚簇索引要比非聚簇索引查询效率高很多。
聚集索引这种主+辅索引的好处是,当发生数据行移动或者页分裂时,辅助索引树不需要更新,因为辅助索引树存储的是主索引的主键关键字,而不是数据具体的物理地址。

③非聚簇索引

非聚集索引,类似于图书的附录,那个专业术语出现在哪个章节,这些专业术语是有顺序的,但是出现的位置是没有顺序的。每个表只能有一个聚簇索引,因为一个表中的记录只能以一种物理顺序存放。但是,一个表可以有不止一个非聚簇索引。

三、Page结构

Page是整个InnoDB存储的最基本构件,也是InnoDB磁盘管理的最小单位,与数据库相关的所有内容都存储在这种Page结构里。Page分为几种类型,常见的页类型有数据页(B-tree Node)Undo页(Undo Log Page)系统页(System Page) 事务数据页(Transaction System Page)等。单个Page的大小是16K(编译宏UNIV_PAGE_SIZE控制),每个Page使用一个32位的int值来唯一标识,这也正好对应InnoDB最大64TB的存储容量(16Kib * 2^32 = 64Tib)。

(下章继续解读)

Mysql聚簇索引和非聚簇索引原理(数据库)相关推荐

  1. mysql聚簇索引存储结构_Mysql聚簇索引和非聚簇索引原理(数据库)

    本文链接:https://blog.csdn.net/lisuyibmd/article/details/53004848 一.'页'和操作系统的关系 ①为什么要有内存管理? 我们知道,一个进程完成他 ...

  2. MySQL聚簇索引和非聚簇索引的原理及使用

    从数据结构角度 1.B+树索引 2.hash索引 3.FULLTEXT索引(InnoDB引擎5.7以后支持) 4.R-Tree索引(用于对GIS数据类型创建SPATIAL索引) 问题:这些索引的区别跟 ...

  3. Mysql数据库索引的理解及聚簇索引和非聚簇索引的区别

    Mysql数据库索引的理解及聚簇索引和非聚簇索引的区别 概念 索引是帮助Mysql搞笑获取数据的数据结构 对Mysql数据库来讲,其核心就是存储引擎,而索引就是属于存储引擎级别的概念,不同的存储引擎对 ...

  4. mysql 聚簇索引和非聚簇索引_MySQL学习之——索引

    转自:CSDN MySQL是目前绝大多数互联网公司使用的关系型数据库,它性能出色.资源丰富.成本低廉,是快速搭建互联网应用的首选关系型数据库.但是,俗话说,"好马配好鞍",仅仅会使 ...

  5. 聚簇索引mysql语句_mysql索引之聚簇索引与非聚簇索引

    1 数据结构及算法基础 1.1 索引的本质 官方定义:索引(Index)是帮助MySQL高效获取数据的数据结构 本质:索引是数据结构 查询是数据库的最主要功能之一.我们都希望查询速度能尽可能快,因此数 ...

  6. Mysql 聚簇索引和非聚簇索引的区别

    聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法.特点是存储数据的顺序和索引顺序一致. 一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引. 在<数据库原理& ...

  7. mysql 聚簇索引和非聚簇索引_MySql聚簇索引与非聚簇索引的区别

    通常情况下,建立索引是加快查询速度的有效手段.但索引不是万能的,靠索 引并不能实现对所有数据的快速存取.事实上,如果索引策略和数据检索需求严重不符的话,建立索引反而会降低查询性能.因此在实际使用当中, ...

  8. mysql聚簇索引创建_MySQL 聚簇索引和非聚簇索引的认识

    聚簇索引是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序的算法.特点是存储数据的顺序和索引顺序一致.一般情况下主键会默认创建聚簇索引,且一张表只允许存在一个聚簇索引. 在<数据库原理&g ...

  9. mysql 聚簇索引和非聚簇索引_聚簇索引和非聚簇索引

    聚簇索引并不是一种单独的索引类型,而是一种数据存储方式.具体细节依赖于其实现方式. MySQL数据库中innodb存储引擎,B+树索引可以分为聚簇索引(也称聚集索引,clustered index)和 ...

最新文章

  1. DevOps之旅:运维人员阅读源代码的实用技巧
  2. sql server 2005 中的同义词
  3. java程序向mysql插入中文变问号
  4. ctrl+Enter 自动加上 .com 而不是 .com.cn
  5. java服务端项目开发规范
  6. Python学习笔记之常用模块总结,持续更新...
  7. LeetCode 题 - 66. 列表元素加一 python实现
  8. java 数据库查询Date类型字段 没有了时分秒 全为 00 的解决办法
  9. 程序员如何达到年薪百万?java程序员必读书籍!
  10. CocosCreator2.3.1切换场景出现Failed to load scene ‘xxx‘ because ‘xxx‘ is already being loaded问题的解决方案
  11. [转] MySQL树结构递归查询处理
  12. python networkx学习
  13. C语言学习资料汇集 助你成为更好的程序员
  14. # 图书馆网上销售系统(c#+sql server)
  15. 谷歌浏览器屏蔽自动更新浏览器提示版本太旧
  16. 深刻理解原型图设计的核心
  17. 史上最全面试题汇总,没有之一,不接受反驳
  18. 跨专业考计算机哪个专业好考吗,考研常识:跨专业考研好考专业?
  19. 《流放者柯南》自建服务器,柯南流亡者:如何设置自己的私人服务器 | MOS86
  20. SJA1000+XC7Z030,SJA1000初始化及PS数据读取

热门文章

  1. 部署 HTTPS 访问 ( https:// )
  2. 用浏览器收藏夹的书签保存javascript的简单脚本
  3. COMSOL 专题学习
  4. 一个完整的网站建设需要哪些流程?
  5. c语言中 #include < > 和include “ “的区别
  6. Annotation 介绍
  7. java.lang.NullPointerException: null
  8. 计算机械结构变形,机械结构温度变化的位移计算.ppt
  9. ARFoundation
  10. 学生用计算机怎么没音效,电脑突然没声音了