一、索引是什么?

  索引是为了加速对表中数据行的检索而创建的一种分散存储的数据结构。而且是实现了高级查找算法的数据结构,索引一般以文件形式存储在磁盘上,索引检索需要磁盘I/O操作。

文章视频讲解:后端开发中MySQL InnoDB 索引以及事务

C/C++ Linux服务器开发高级架构免费学习视频点击:C/C++Linux服务器开发高级架构师/Linux后台架构师

二、为什么要使用索引?

  1. 索引能极大的减少存储引擎需要扫描的数据量。
  2. 索引可以把随机IO变成顺序IO。
  3. 索引可以帮助我们在进行分组、排序等操作时,避免使用临时表。

三、磁盘存取原理

  磁盘存取有以下特点:

  • 寻道时间(速度慢,费时);
  • 旋转时间(速度较快);
  • 预读:长度为页的整倍数( 主存和磁盘以页为单位交换数据,一页4K);
  • 空间连续性原理:被访问的数据,其所在的位置周围的数据也有更高的可能性被访问。

四、索引是什么实现的?

  Indexes是第三方公司提供的可插拔的插件式存储引擎。

  MySQL结构体系:

五、为什么选用B+树?

  1、Hash索引方式

  其实在我们数据库中也使用到了Hash的索引方式,数据库默认有就是这两种实现方式:Hash和B+树,如图所示:

  优点:

  • 如果是等值查询,哈希索引明显有绝对优势, 前提:键值唯一,而且不涉及到范围查找,模糊匹配,如电话号码就很适合。

  缺点:

  • 利用Hash存储的话需要将所有的数据文件添加到内存,比较耗费内存空间。
  • 哈希索引没办法完成范围查询检索
  • 哈希索引也没办法利用索引完成排序,以及like ‘xxx%’ 这样的部分模糊查询
  • 哈希索引也不支持多列联合索引的
  • 在有大量重复键值情况下,哈希索引的效率也最左前缀原则是极低的,因为存在哈希碰撞问题

  2、二叉树、红黑树索引方式

  缺点:

  • 太深:数据处的高/深度决定着他的IO操作次数, IO操作耗时大。应先把数据读取效率。
  • 太小:每一个磁盘块(节点/页)保存的数据量太小了。

C/C++Linux服务器开发高级架构师学习文档电子书籍 点击 linux服务器学习资料 获取,内容知识点包括Linux,Nginx,ZeroMQ,MySQL,Redis,线程池,MongoDB,ZK,Linux内核,CDN,P2P,epoll,Docker,TCP/IP,协程,DPDK等等。学习视频点击:C/C++Linux服务器开发高级架构师/Linux后台架构师 

3、B树(B-树)的索引方式

  缺点:

  • B树的每个节点既有key又有data,但是每个页存储的空间是有限的,如果data较大的话,那么会导致每个节点存储的key数量变小。
  • 当存储的数据量很大的时候会导致深度较大,增大查询时候的磁盘IO次数,影响查询性能。
  • Mysql查询的时候使用到了大量的范围查找,B树在性能上并不能满足大量范围查找。

  B+Tree与B-Tree的区别:

  • B+节点关键字搜索采用闭合区间。(MYSQL推崇使用ID作为索引,由于ID是自增的数字类型,只会增大,所以采用向右拓展的一个方式。)
  • B+非叶节点不保存数据相关信息, 只保存关键字和子节点的引用。
  • B+关键字对应的数据保存在叶子节点中。
  • B+叶子节点是顺序排列的, 并且相邻节点具有顺序引用的关系。

  选择B+Tree优点:

  • B+树是B-树的变种( PLUS版) 多路绝对平衡查找树, 他拥有B-树的优势。
  • B+树的叶子节点是顺序排列的,且相邻接点具有顺序引用关系,因此在范围查找时扫库、 表能力更强,同时排序能力更强。
  • B+树仅仅在叶子节点存储数据,这样索引文件更小,磁盘读写能力更强。
  • B+树的树高较低,索引文件较小,IO次数稳定,查询效率更加稳定。

六、B+树的索引实现方式

  查看数据存储位置:

show variables like 'datadir';

  1、MyIsam(非聚集索引)

  索引和数据分别存储。表定义存在.frm文件中(每个存储引擎都会有)。表中数据存在.MYD文件中。索引存在.MYI文件中。

  如果同一张表多个索引:

  每个索引都存有每条数据的地址,一旦有变,维护起来比较耗时。

  2、InnoDB(聚集索引)

  数据就存在索引的叶子节点中。
  辅助索引:

  其他索引存主键,再从主键索引中找数据。

  注意:

  • InnoDB是通过B+树结构对主键创建索引,然后叶子节点中储存记录,如果没有主键,那么会选择唯一键,如果没有唯一键,那么会生成一个6位的row_id来作为主键。
  • 如果创建索引的键是其他字段,那么在叶子节点中存储的是该记录的主键,然后再通过主键索引找到对应的记录。  

  为什么不推荐UUID,使用UUID有以下问题:

  • UUID一般是32位,长度较长,由于一次预读是4K,这样就增加了读的次数,同时会造成度degree变小,树变高;
  • UUID是一个无序的序列,在插入到B+树的时候,设计多次B+树的平衡调整,当树大了的时候性能就会变得很低;
  • 由于无序的原因,因此分页查询的时候就会很麻烦。

七、索引注意事项

  1、联合索引列选择原则

  • 经常用的列优先 【 最左匹配原则】
  • 选择性( 离散度) 高的列优先【 离散度高原则】(列的离散性越高,选择性就越好。)
  • 宽度小的列优先【 最少空间原则】

  2、覆盖索引

  如果查询列可通过索引节点中的关键字直接返回, 则该索引称之为覆盖索引。

  覆盖索引可减少数据库IO, 将随机IO变为顺序IO, 可提高查询性能。

  比如创建索引:

create index idx_name_phoneNum on users(name,phoneNum);
xxxxxxxxxxbr create index idx_name_phoneNum on users(name,phoneNum);

  查询语句:

select name,phoneNum from user where name=?
xxxxxxxxxxbr select name,phoneNum from user where name=?

  可直接从索引树中返回关键字,不会再去查数据内容。

  3、其他注意事项

  1. 索引列的数据长度能少则少。
  2. 索引一定不是越多越好, 越全越好, 一定是建合适的。
  3. 匹配列前缀可能用到索引 like 9999%, like %9999%、 like %9999用不到索引。like 9999%得看情况,如果索引列离散性高,就能用到索引,离散性低,就用不到索引。
  4. Where 条件中 not in 和 <>操作无法使用索引。
  5. 匹配范围值, order by 也可用到索引。
  6. 多用指定列查询, 只返回自己想到的数据列, 少用select * 以减少IO。
  7. 联合索引中如果不是按照索引最左列开始查找, 无法使用索引。在执行常量等值查询时,改变索引列的顺序并不会更改explain的执行结果,因为mysql底层优化器会进行优化,但是推荐按照索引顺序列编写sql语句。
  8. 联合索引中精确匹配最左前列并范围匹配另外一列可以用到索引。(索引列为name,age的话,name=‘zhangsan’ and age>20)
  9. 联合索引中如果查询中有某个列的范围查询, 则其右边的所有列都无法使用索引。(索引列为age,name的话,age>20 and name=‘zhangsan’)

附:B+树添加和删除数据图解 (请放大查看)

后端开发-MySQL学习之索引机制最详细版(B+树)相关推荐

  1. 后端开发-MySQL数据库相关流程图原理图

    前言 整理了一些 MySQL 数据库相关流程图/原理图.做一下笔记,分享给大家一起学习. 1. MySQL 主从复制原理图 MySQL 主从复制原理是大厂后端的高频面试题,了解 MySQL 主从复制原 ...

  2. Java Web和Java后端开发的学习路线

    基础:比如计算机系统.算法.编译原理等等 Web开发: 主要是Web开发相关的内容,包括HTML/CSS/JS(前端页面).Servlet/JSP(J2EE)以及Mysql(数据库)相关的知识.它们的 ...

  3. Python后端开发岗学习路线是什么

    前言 Python web开发工程师 2022年7月平均薪资超过21000元.并且是招聘量十分巨大的岗位,即使是二线城市,岗位需求也非常高. (文末送读者福利) 今天给大家分享一位前辈整理的一个Pyt ...

  4. 高性能mysql学习笔记--索引

    高性能mysql 五:索引 1,B-Tree索引 全值匹配:匹配所有列. 匹配最左前缀:只使用索引的第一列. 匹配列前缀:只使用索引的第一列. 匹配范围值:只使用索引的第一列. 精确匹配某一列并范围匹 ...

  5. 微信开发众筹项目视频教学小程序+java后端开发+mysql数据库

    用HBuilder X开发微信小程序,java后端开发工具idea,mysql数据库,主要功能有:用户管理.分类列表.分类金额.众筹列表.订单列表.系统设置.权限分配 源码下载地址:>>& ...

  6. 土木工程转专业,上岸趣头条、今日头条后端开发,学习历程分享

    学习群小伙伴的学习面试经历,在去年刚转专业开始学习的时候给到他路线和学习过程中的帮助,所以他在学习过程中基本没走弯路,执行力也很强.里面提到的很多学习上的点也是我在文章中一直反复强调的,其他同学可以借 ...

  7. mysql b tree_Mysql索引机制(B+Tree)

    1,索引谁实现的: 索引是搜索引擎去实现的,在建立表的时候都会指定,搜索引擎是一种插拔式的,根据自己的选择去决定使用哪一个. 2,索引的定义: 索引是为了加速对表中数据行的检索而创建的一种分散存储的( ...

  8. mysql学习笔记-索引优化【1】-索引失效原因

    索引失效应该避免 案例(索引失效) # demo 数据 DROP TABLE IF EXISTS `staffs`; CREATE TABLE `staffs` (`id` int(11) NOT N ...

  9. 《MySQL学习》 索引 下 覆盖索引,MRR,联合索引

    一. 覆盖索引 有一张表T1,它的建表语句如下 mysql> create table T1 ( ID int primary key, k int NOT NULL DEFAULT 0, s ...

最新文章

  1. [scala-spark]7. list 与 map
  2. 简单易用的库存管理软件、进销存软件
  3. ORACLE 数据同步时,批量进行新增和更新操作的SQL写法
  4. 如何使用JMeter建立webSocket连接
  5. 当代网瘾少年分析,以“2020年,我打了多少局王者荣耀”为例
  6. vue3 + ts + EsLint + Prettier 规范代码
  7. 安卓掌读小说v1.5.8破解版免费分享
  8. mysql 重做日志原理_Oracle恢复内部原理(重做日志)
  9. NBA球员数据爬虫练习
  10. Computer Vision 杂志对何恺明 Rethinking ImageNet Pre-training 的最新评论
  11. Android开发过程中遇到的异常
  12. 深度学习英文缩写_机器学习、深度学习……人工智能那些名词你知道几个?
  13. 1、ATK-LORA-01
  14. 基于C51的DMX512开发笔记
  15. 前后端分离项目部署(部署在同一台服务器)
  16. 容器化 Spring Boot 代码的 9 个技巧
  17. 后pc时代和新一代计算机定义,嵌入式系统:后PC时代的擎天之柱-可编程逻辑-与非网...
  18. (四)vivado Simulator仿真软件的使用
  19. 使用MATLABsimulinkstm32mat_targetstm32cubemx开发stm32
  20. 离散世界模型,带你轻松玩转 Atari 游戏

热门文章

  1. 100578计算机基础II,什么是人工智能?人工智能专业主要课程有哪些
  2. corrplot和ggcorrplot画热力图
  3. VR全景看考场,线上“踩点”不迷路
  4. css三行代码实现多行文字超出部分省略号代替
  5. Spark开发环境搭建(提供实验平台)
  6. iveryone火速上车 抢第一波
  7. 阿里店铺如何制作并导出数据包
  8. C语言:计算2的50次方需要多久?
  9. 微信小程序访问阿里云flask网页
  10. windows上Tomcat注册为服务