mysql基础之一->索引

算法琉璃客
• 阅读 1107

一、前置知识

1、常见索引面试题

▪ 数据库中最常见的慢查询优化方式是什么?
▪ 为什么加索引能优化慢查询?
▪ 你知道哪些数据结构可以提高查询速度?
▪ 那这些数据结构既然都能优化查询速度,Mysql为何选择使用B+树?

2、基础知识储备

▪ 局部性原理
mysql基础之一->索引
▪ 磁盘预读(预读的长度一般为页(page)的整数倍)
– 页是存储器的逻辑块,操作系统往往将主存和磁盘存储区分割为连续的大小
相等的块,每个存储块称为一页(在许多操作系统中,页大小通常为4k),
主存和磁盘以页为单位交换数据。

3、mysql执行流程

mysql基础之一->索引

二、索引

1、索引是什么

▪ 索引是帮助 MySQL 高效获取数据的数据结构
▪ 索引存储在文件系统中
▪ 索引的文件存储形式与存储引擎有关

2、索引文件的结构

hash

哈希表可以完成索引的存储,每次在添加索引的时候需要计算指定列的hash值,取模运算后计算出下标,将元素插入下标位置即可
适合的场景:

等值查询

表中的数据是无序数据(返回查找的时候比较浪费时间,需要挨个进行遍历操作)

返回查找不合适

hash表在使用的时候,需要将全部数据加载到内存,比较耗费内存的空间,也不是很合适

在树的结构中,左子树必须小于双亲节点,右子树必须大于双亲节点,如果是多叉树,从左到右是有序的

树:多叉树->二叉树(二分查找)->AVL树(平衡树)->红黑树

AVL树:是一种严格意义上的平衡树,最高子树跟最低子树高度只差不能超过1,因此在进行元素插入的时候,会进行1到N此旋转,严重影响插入的性能

红黑树:是基于AVL树的一个升级,损失了部分查询的性能,来提升插入的性能,在红黑树中最低子树跟最高子树之差小于2倍即可,在插入的时候不需要进行N多次的旋转操作,而且还加入了变色的特性,来满足插入和查询的性能的平衡

二叉树及其N多的变种,都不能支撑索引,要么是树的深度无法控制,要么是

B树

mysql基础之一->索引

所有键值分布在整颗树种

搜索有可能在非叶子节点结束,在关键字全集内做一次查找,性能逼近二分查找

每个节点最多拥有m个子树

根节点至少有2个子树

分支节点至少拥有m/2颗子树(除根节点和叶子节点外都是分支节点)

所有叶子节点都在同一层,每个节点最多可以有m-1个key,并且升序排列

缺点:

1、每个节点都有key,同时也包含data,而每个页存储空间是有限的,如果data比较大的话会导致每个节点存储的key数量变小
2、当存储的数据量很大的时候会导致树的深度较大,增大查询时磁盘的IO次数,进而影响查询性能
B+树

mysql基础之一->索引

B+树是在B树的基础之上做的一种优化,变化如下

(1)B+Tree每个节点可以包含更多的节点,这么做的原因有两个,第一个是为了降低树的高度,第二个是将数据范围变为多个区间,区间越多,数据检索越快

(2)非叶子节点存储key,叶子节点存储key和数据

(3)叶子节点两两指针相互连接(符合磁盘的预读特性),顺序查询性能更高

3、索引的分类

▪ mysql索引的五种类型:主键索引、唯一索引、普通索引和全文索引、组合索引。通过给字段添加索引
可以提高数据的读取速度,提高项目的并发能力和抗压能力。

主键索引

– 主键是一种唯一性索引,但它必须指定为PRIMARY KEY,每个表只能有一个主键。

唯一索引

– 索引列的所有值都只能出现一次,即必须唯一,值可以为空,唯一索引不会回表。

普通索引

– 基本的索引类型,值可以为空,没有唯一性的限制。(覆盖索引)

全文索引,MyISAM支持,Innodb在5.6之后支持

– 全文索引的索引类型为FULLTEXT。全文索引可以在varchar、char、text类型的列上创建

组合索引

– 多列值组成一个索引,专门用于组合搜索(最左匹配原则)

4、Mysql存储引擎

mysql基础之一->索引
不同的存储引擎,数据文件和索引文件存放的位置是不同的,因此有了分类:

聚簇索引:数据和文件放在一起:InnoDB

.frm:存放的是表结构
.ibd:存放的是数据文件和索引文件
注意:mysql的InnoDB存储引擎默认情况下会把所有的数据文件放到表空间中,不会为每一个单独的表保存一份数据文件,如果需要每一个表单独使用文件保存,设置如下属性:set global innodb_file_per_table=on;

非聚簇索引:数据和文件分开放:MyISAM

.frm:存放表结构
.MYI:存放索引数据
.MYD:存放实际数据

5、mysql索引机制

mysql基础之一->索引
mysql基础之一->索引

6、索引难点

回表
1、InnoDB是通过B+树结构对主键创建索引,然后叶子节点种存储记录,如果没有主键,那么会选择唯一键,如果没有唯一键,那么会生成一个隐藏的6位的row_id来作为主键
2、如果创建索引的列是其他字段,那么在叶子节点中存储的是该记录的主键,然后再通过主键找到对应的记录,叫做回表
3、MyISAM:不存在回表问题,原因是MySIAM存储引擎,索引文件和数据文件是分开存放的,在B+树的叶子节点存储的是数据行所在的磁盘地址,普通索引也是如此,所以不存在回表问题
覆盖索引
1、针对InnoDB,覆盖索引是指,如果查询的时候用到的是普通索引,而查询的列正好是主键id,那么在普通索引的B+树中叶子节点存储的正好就是主键id,直接返回即可,便不需要再去主键索引的B+树中遍历
最左前缀
1、最左前缀,是指使用组合索引的时候,必须从左到右依次匹配索引列
索引下推

参考https://zhuanlan.zhihu.com/p/121084592

点赞
收藏
评论区
推荐文章
MYSQL-INNODB索引构成详解
对于MYSQL的INNODB存储引擎的索引,大家是不陌生的,都能想到是B树结构,可以加速SQL查询。但对于B树索引,它到底“长”得什么样子,它具体如何由一个个字节构成的,这些的基础知识鲜有人深究。本篇文章从MYSQL行记录开始说起,层层递进,包括数据页,B树聚簇索引,B树二级索引,最后在文章末尾给出MYSQL索引的建议。文章涉及较多基础知识,内容较为枯燥,因此采用较多的图片补充说明,希望能对读者有帮助。
深入理解MySQL索引底层数据结构
在日常工作中,我们会遇见一些慢SQL,在分析这些慢SQL时,我们通常会看下SQL的执行计划,验证SQL执行过程中有没有走索引。通常我们会调整一些查询条件,增加必要的索引,SQL执行效率就会提升几个数量级。我们有没有思考过,为什么加了索引就会能提高SQL的查询效率,为什么有时候加了索引SQL执行反而会没有变化,本文就从MySQL索引的底层数据结构和算法来进行详细分析。
Wesley13 Wesley13
3年前
mysql配置调优
工作中,会遇到需要查看mysql的top20慢sql,逐个进行优化,加上必要的索引这种需求,这时就需要开启数据库的慢查询日志的功能1.查询当前慢查询日志的状态\默认为关闭状态mysqlshowvariableslike"
Wesley13 Wesley13
3年前
MySQL索引原理及慢查询优化 一个慢查询引发的思考 MySQL索引原理 慢查询优化
这是一篇美团技术团队总结的关于MySQL索引原理及慢查询优化的文章,还是非常有参考价值的,文章虽长,但是写的很清楚,值得学习MySQL凭借着出色的性能、低廉的成本、丰富的资源,已经成为绝大多数互联网公司的首选关系型数据库。虽然性能出色,但所谓“好马配好鞍”,如何能够更好的使用它,已经成为开发工程师的必修课,我们经常会从职位描述上看到诸如
Wesley13 Wesley13
3年前
MySQL千万级别优化·中
MySQL千万级别的查询优化手段·中单列索引(假设在v\_record表中存在id列的索引)1、WHERE条件使用​EXPLAINSELECT\FROMv\_recordWHEREid2​结论:利用索引进行回表查询2、SELECT字段使用
Wesley13 Wesley13
3年前
mysql索引原理与慢查询优化2
七正确使用索引一索引未命中并不是说我们创建了索引就一定会加快查询速度,若想利用索引达到预想的提高查询速度的效果,我们在添加索引时,必须遵循以下问题1范围问题,或者说条件不明确,条件中出现这些符号或关键字:、、<、<、!、between...and...、like、_大于号、小于号_!(https://
Wesley13 Wesley13
3年前
MySQL知识体系——索引
    本文直切主题,针对InnoDB引擎描述索引及优化策略。在开始之前,需要读者了解:1)二叉查找树(包括23查找树、红黑树等数据结构)2)MySQL的InnoDB引擎基础知识索引初探要了解索引,当然要了解其数据结构。树有很多应用,流行的用法之一是包括UNIX和DOS在内的许多常用操作系统中的目录结构,二叉查找树又是Java中两种集合
Wesley13 Wesley13
3年前
mysql查询优化explain命令详解
mysql查询优化的方法有很多种,explain是工作当中用的比较多的一种检查方式。explain翻译即解释,就是看mysql语句的查询解释计划,从解释计划我们能很清楚的看到解释的语句有没有合理用到索引,扫描了多少行数,有没有触及全表扫描、用到临时表等影响慢查询的原因。使用很简单,如explainselect\fromuse
Wesley13 Wesley13
3年前
mySql索引优化分析
MySQL索引优化分析为什么你写的sql查询慢?为什么你建的索引常失效?通过本章内容,你将学会MySQL性能下降的原因,索引的简介,索引创建的原则,explain命令的使用,以及explain输出字段的意义。助你了解索引,分析索引,使用索引,从而写出更高性能的sql语句。还在等啥子?撸起袖子就是干!案例分析我们先
Wesley13 Wesley13
3年前
Mysql索引最佳实践笔记0524
mysql5.7innodb默认存储引擎一、关于索引二、最佳实践三、避坑实践一、关于索引1.索引的作用提高查询效率数据分组、排序避免回表查询优化聚集查询用于多表join关联查询利用唯一性约束、保证数据唯一性innodb行锁实现索引的“
京东云开发者 京东云开发者
8个月前
从MySQL JOIN 算法角度看如何优化SQL
作者:京东物流京东物流一、前言在做MySQL的SQL优化时,如果只涉及到单表查询,那么大部分慢SQL都只需从索引上入手优化即可,通过添加合适的索引来消除全表扫描或者排序操作,执行效果,大概率能实现质的飞跃。然而,在实际生产中,除了单表查询,更多的是多个表的