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

大家好 , 我是melo,一名大二后台练习生,大年初三 , 我又来充当反内卷第一人了?。。?
专栏引言MySQL,一个熟悉又陌生的名词,早在学习Javaweb的时候,我们就用到了MySQL数据库,在那个阶段,MySQL对我们来说似乎只是一个存储数据的好东西 , 存储时一股脑往里边塞,查询时也是盲目的全表查询(不带一点点优化) 。?
我们总是自欺欺人的觉得,我们通过其他方面来优化就好了阿,迟迟不愿面对MySQL高级 , 转而学习一些看似更为"高级"的东西,学Redis , 来分担MySQL的压力,学MyCat等中间件 , 实现主从复制 , 读写分离,分库分表等等 。(说的就是melo没错了)?
到了准备面试的时候,发现面试题里边的MySQL一问三不知~
「MySQL高级篇」MySQL索引原理,设计原则

文章插图
而自己学到的前沿中间件,问的几乎很少?。∽约阂仓皇腔嵊?,写简历时只能弱弱写上"了解"xxx中间件……?
当然了,学习MySQL高级篇,不单单只是为了面试,实际的项目中,这一块的优化是十分重要的,体验过服务器宕机后,只能默默........
「MySQL高级篇」MySQL索引原理,设计原则

文章插图
?
从现在开始吧,此时上岸还来得及?。。〕米糯蠖系暮伲?补充补充MySQL高级篇的知识点,从如下几方面开启 MySQL高级篇之旅
「MySQL高级篇」MySQL索引原理,设计原则

文章插图
本篇速览早在MySQL基础篇,我们就听说了索引这么个东西,听起来是个很高级的东西,但当时只停留在了,索引能够加快查找的效率这一阶段的认知 。这篇将从如下几点,来带你逐一攻破ta:
  • 索引到底是什么
  • 索引底层的实现
  • 聚簇索引是什么?二级索引呢?
  • 最左前缀原则
  • 如何设计索引,遵循的原则
  • 索引相关语法
?
本篇篇幅较长,全文近6000字,可以收藏下来慢慢啃,没事就掏出来翻阅翻阅 。建议通过侧边栏目录检索对您有帮助的部分,其中有emoji表情前缀属于重点部分,觉得对您有帮助的话,melo还会持续更进完善本篇文章和MySQL专栏 。
  • 不过就怕等到我更新时,那会您不方便找到我了hhh(高情商求关注)
索引定义MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序) 。索引是在数据库表的字段上添加的,是为了提高查询效率存在的一种机制 。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法 , 这种数据结构就是索引 。如下面的示意图所示 :
其实简单来说,索引就是一个排好序的数据结构

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

文章插图
?
左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的) 。为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找快速获取到相应数据 。
索引优势
  • 加快查找和排序的速率,降低数据库的IO成本以及CPU的消耗
  • 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性 。
索引劣势
  1. 索引实际上也是一张表,保存了主键和索引字段 , 并指向实体类的记录,本身需要占用空间
  2. 虽然增加了查询效率,但对于增删改,每次改动表,还需要更新一下索引
    1. 新增:自然需要在索引树中新增节点
    2. 删除:索引树中指向的记录可能会失效,意味着这棵索引树很多节点,都是失效的
    3. 改动:索引树中节点的指向可能需要改变
但实际上呢,我们MySQL中并不是用二叉查找树来存储 , 为何呢?
要知道 , 二叉查找树,此处一个节点只能存储一条数据,而一个节点呢,在MySQL里边又对应一个磁盘块,这样我们每次读取一个磁盘块,只能获取一条数据,效率特别的低,所以我们会想到采用B树这种结构来存储 。
索引结构索引是在MySQL的存储引擎层中实现的,而不是在服务器层实现的 。所以每种存储引擎的索引都不一定完全相同 , 而且也不是所有的引擎都支持所有的索引类型 。?

推荐阅读