:接触mysq也有两年左右的时间了,但是对该数据库的理解自认还比较初级,看过很多文章,也看过一些相关的书籍,依然小白。。。。(这里个人总结是两点主要原因:1.对mysql的学习大部分都是源于看一些杂七杂八的文章,很多文章本身表述有误或不准确。2.实操较少,平时增删改查索引的使用很常规,缺少钻研精神 3.第三点也就是写这篇文章的主要目的,看到的东西经常是看了就看了,过一段时间就忘记了,然后反复重复这样的经历,时间花的不少,但是这样永远不会对mysql系统掌握,故而打算通过文章把对mysql的理解落地,理解多少写多少,可能会东一点西一点比较乱,日后逐渐完善吧)

对索引的认识:

什么是索引?

我最初的理解是把索引当场一本字典的目录。

假如一本字典没有目录,那我们想查到某个字只能从头找到尾。

所以才会对字典按照页码来进行划分,并且在字典的最开始几页,有相应的目录可以让我们知道目标字在哪一页,从而快速定位到目标。

而且根据需求的不同,一般用过字典的小伙伴都知道,有按照拼音开头的目录,有按照偏旁部首开头的目录,等等。。。 其实和mysql中的 主键索引 联合索引 等等种类的索引是异曲同工的。

数据结构:

mysql索引使用的数据结构是B+树,目前大部分数据库系统都采用 B+Tree 或 B-Tree 这两种数据结构,本文不打算详解其中原因(对两种数据结构细节感兴趣的可以参考其他文章)

简单来说,索引文件一般是存在于硬盘当中,由于数据量大无法全部一次加载进内存。而磁盘的IO读取代价相比于内存读取代价要高很多倍,所以我们在选择数据结构上面,最重要的一点就是尽可能减少对磁盘io的操作。

数组:索引文件无法一次加载进内存

链表:查询需要从头到尾的查询

上面的两种B树特点决定了他们可以保证尽可能少的进行io操作,而且相对于平衡二叉树、二叉搜索树等数据结构,树的高度要低很多,查询对应的io次数更少。

而B+Tree和B-Tree的区别主要是前者的非叶子节点不存储数据,目的是能够存储更多的索引,保证整颗树更“矮”,但是想要找到数据必须进行树的高度次IO操作(即B+Tree的高度为3,则需要进行3次IO操作,在叶子节点上找到目标数据)

而B-Tree不论叶子节点还是非叶子节点都存放数据,好处是可能在没有到达叶子结点的时候就找到了目标数据

但是B-Tree如果想要存放和B+Tree相同量的索引,则必须让树的高度增加,也就是增加io次数,所以B+Tree相对更稳定

聚集索引和非聚集索引:

在mysql当中,不同的存储引擎对索引的实现是不同的,本文介绍常见的两种mysql存储存储引擎对索引的实现,即MyISAM存储引擎和InnoDB存储引擎,二者对索引的实现分别为非聚集索引(非聚簇索引)和聚集索引(非聚簇索引),这也是最常见的两种索引的实现

1、MyISAM索引实现:

MyISAM引擎使用的是非聚集索引的形式,简单来说是索引和数据是分开存放的,索引存放的是数据文件的地址,我们需要先找到索引,然后再通过索引找到数据

在MyISAM引擎中,主键和一般索引在结构上没有区别,只是主键必须是唯一的,但是在查询时,普通索引和主键索引都是需要先获得数据文件地址,再去找到相应的数据

2、InnoDB索引实现

该存储引擎使用的是聚集索引,该索引方式最明显的特点就是主键索引和数据是在一起的(同一个文件中),可以理解为找到了主键索引也就找到了数据,不需要二次查找

而该索引结构当中的普通索引,想找到数据,也必须通过主键索引进行二次查找才可以

即:通过主键索引查找数据,查找一次 ,而通过普通索引查找数据,则需要普通索引找到主键索引,通过主键索引找到数据,也就是所谓的二次查找

如图为:mysql中两种索引方式的对比

如图,为B+树组织数据的方式:

实际存储时当然不会每个节点只存3条数据。

以InnoDB引擎为例,简单计算一下一颗B+树可以存放多少行数据。

B+树特点:只有叶子节点存储数据,而非叶子节点存放的是用来找到叶子节点数据的索引(如上图:key和指针)

InnoDB存储引擎的最小存储单元为16k(就像操作系统的最小单元为4k 即1页),在这即B+树的一个节点的大小为16k

假设数据库一条数据的大小为1k,则一个节点可以存储16条数据

而非叶子节点,key一般为主键假设8字节,指针在InnoDB中是6字节,一共为14字节,一个节点可以存储 16384/14 = 1170个索引指针

可以算出一颗高度为2的树(即根节点为存储索引指针节点,还有1170个叶子节点存储数据),每个节点可以存储16条数据,一共1170*16条数据  = 18720条

高度为3的树,可以存放 1170 * 1170 * 16 = 21902400条记录

两千多万条数据,我们只需要B+树为3层的数据结构就可以完成,通过主键查询只需要3次IO操作就能查到对应记录。

初识mysql索引 - 小白篇的更多相关文章

  1. MySQL索引——总结篇

    MySQL索引 MySQL索引 数据库的三范式,反模式 零碎知识 索引 索引原理 B Tree索引 B+Tree索引 B Tree 与 B+Tree的比较 聚集索引和辅助索引 聚集索引的注意事项 索引 ...

  2. mysql学习【第1篇】:初识MySQL

    狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! mysql学习[第1篇]:初识MySQL 只会写代码的是码农:学好数据库,基本能混口饭吃:在此基 ...

  3. 小白两篇博客熟练操作MySQL 之 第二篇

    小白两篇博客熟练操作MySQL  之   第二篇 一. 视图 视图是一个虚拟表,其本质是根据SQL语句获取动态的数据集,并为其命名,用户使用时只需使用名称即可获取结果集, 并可以将其当做表来使用. s ...

  4. 小白两篇博客熟练操作MySQL 之 第一篇

    小白两篇博客熟悉操作MySQL  之   第一篇 一.概述 1. 什么是数据库? 答: 储存数据的仓库, 如: 在ATM的事例中创建的一个db 目录, 称为数据库 2. 什么是Mysql, Oracl ...

  5. Mysql高手系列 - 第22篇:深入理解mysql索引原理,连载中

    Mysql系列的目标是:通过这个系列从入门到全面掌握一个高级开发所需要的全部技能. 欢迎大家加我微信itsoku一起交流java.算法.数据库相关技术. 这是Mysql系列第22篇. 背景 使用mys ...

  6. Mysql索引(一篇就够le)

    我想很多人对mysql的认知可能就是CRUD(代表创建(Create).更新(Update).读取(Retrieve)和删除(Delete)操作),也不敢说自己会用和熟悉mysql,当然我就是其中一个 ...

  7. 「 MySQL高级篇 」MySQL索引原理,设计原则

    大家好,我是melo,一名大二后台练习生,大年初三,我又来充当反内卷第一人了!!! 专栏引言 MySQL,一个熟悉又陌生的名词,早在学习Javaweb的时候,我们就用到了MySQL数据库,在那个阶段, ...

  8. 「MySQL高级篇」MySQL索引原理,设计原则

    大家好,我是melo,一名大二后台练习生,大年初三,我又来充当反内卷第一人了!!! 专栏引言 MySQL,一个熟悉又陌生的名词,早在学习Javaweb的时候,我们就用到了MySQL数据库,在那个阶段, ...

  9. mysql 索引篇

    一.索引优化   索引优化主要还是依赖explain命令,关于explain命令相信大家并不陌生,具体用法和字段含义可以参考官网explain-output,这里需要强调rows是核心指标,绝大部分r ...

随机推荐

  1. LINUX系统学习以及初学者系统下载

    Linux系统常用命令大全 来源:服务器之家 [博客中所有文章如有不对的地方希望看官们指出,有问题也可以提出来相互交流,相互学习,感谢大家!] 初学者建议安装:sentOS Ubuntu系统下载连接h ...

  2. Kubernetes 系列(六):持久化存储 PV与PVC

    在使用容器之后,我们需要考虑的另外一个问题就是持久化存储,怎么保证容器内的数据存储到我们的服务器硬盘上.这样容器在重建后,依然可以使用之前的数据.但是显然存储资源和 CPU 资源以及内存资源有很大不同 ...

  3. 如何评价一个VR体验设计?

    如何评价一个VR系统的体验是好是坏?或者说,哪些因素会破坏一个VR的体验? Kruij和Riecke教授在IEEE VR会议上提到了四个角度:Congnition,Game User Experien ...

  4. 05-pandas索引切片读取数据缺失数据处理

    引入 numpy已经能够帮助我们处理数据,能够结合matplotlib解决我们数据分析的问题,那么pandas学习的目的在什么地方呢? numpy能够帮我们处理处理数值型数据,但是这还不够 很多时候, ...

  5. js 验证数据类型的4中方法

    1.typeof  可以检验基本数据类型 但是引用数据类型(复杂数据类型)无用: 总结 : typeof  无法识别引用数据类型  包括 bull; 2.instanceof是一个二元运算符,左操作数 ...

  6. Map(映射)

    散列表介绍: 数组和链表都可以是有序的(即存储顺序与取出顺序一致),但这样是有代价的,需要遍历才可以寻找某一特定元素: 而还有另外的一些存储结构:不在意元素的顺序,能够快速的查找元素的数据 其中就有一 ...

  7. Dockerfile 构建镜像

    一.使用dockerfile构建镜像 基本结构: a.设置基础镜像 当前镜像继承于的基础镜像 FROM centos:latest  b.设置维护者信息 没有固定格式  c.设置需要添加到容器中的文件 ...

  8. vim设置golang语法高亮 (Centos)

    Go语言自带vim 的语法高亮文件. http://www.golangtc.com/download 下载   go1.3.3.src.tar.gzgo1.3.3 (source only),解压缩 ...

  9. 【Sqlserver】查询结果导出excel

    1.右键数据库——>任务——>导出数据,打开SQL Server导入和导出向导: 2.选择当前数据库,填写用户名,密码,下一步: 3.选择目标类型 excel,选择导出模板,下一步: 4. ...

  10. Spring入门(十五):使用Spring JDBC操作数据库

    在本系列的之前博客中,我们从没有讲解过操作数据库的方法,但是在实际的工作中,几乎所有的系统都离不开数据的持久化,所以掌握操作数据库的使用方法就非常重要. 在Spring中,操作数据库有很多种方法,我们 ...