MySQL索引的理解学习,面试不问索引原理就是事务原理

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL索引的理解学习,面试不问索引原理就是事务原理

MySQL执行SQL的整体流程

显示需要跟MYSQL Server 进行连接. 获取MySQL服务. 跟数据库进行交互.


connection Pool 连接池。提前创建多条连接通道. 新的连接请求到来就复用连接通道.


一条连接的建立对应一个线程的创建.  存在多线程并发操作数据库的问题.                


--- 引出事务原理. 事务就是专门用来处理。  多连接并发时所产生的问题.


多线程 / 多连接同时对于 数据库进行写操作势必会产生什么?    脏数据

 咋处理的, 无非是  MVCC + mutex.  此处如果想要细致了解的, 可以看如下文章.

然后连接建立好之后就是对于客户端发过来的SQL语句进行解析优化.  查缓存.


缓存没有,交到存储引擎去查找, 去存储,去修改, 去插入, 去删除 (索引B+树)


很多大公司对于存储引擎的研究,研发岗都是特别重要核心的,所以对存储引擎感兴趣的可以去深究,算是一个很好的方向。大厂对此绝对有需求. 因为他实在太重要了,可以说是MySQL等数据库server的核心所在.

引言, MySQL索引底层学习原因

为何一定要理解索引的底层原理?  我会增删改查这些基本操作不就OK了嘛.


的确,对于以后的工作日常而言,增上改查对于我们普通的开发工程师来说是要不完的。


可是,面试的时候会问。


而且对于我们服务器开发工程师而言,必须理解性能优化上的点点滴滴细节, 一定要从底层数据结构进行理解,因为总有一天我们可能成为更优秀的人, 成为架构师. 而且对于知识的理解点到位可以无形的根深你的记忆.

磁盘介绍(理解磁盘IO)

我们常常在面试的时候回答使用B+树可以减少磁盘IO。索引的加入可以提高查询效率. 可以这些都过于浅显了. 我们甚至连磁盘是什么结构都不知道, 仅仅知道的是磁盘IO效率很低. 时间消耗很长. 远远大于内存IO

磁盘是由磁盘面, 磁道, 扇区, 读写磁头构成的.  

扇区的大小是512个字节. (现在有些改成了4k), 很明显扇区就是用来存储的. 存储着数据库文件.

所以第一个问题来了? 我们查找数据库记录. 进行IO交互是直接按照扇区为单位进行交互吗?


NONONO.     是按照page进行一次IO交互的.


系统读取磁盘,page基本单位是 4KB 。


MySQL 进行IO的基本单位是 16KB 也就是 page = 16KB


为何page是更大了. 为何一次IO操作, IO交互是读取更多的数据到内存更好?


很明显, 一次读取的数据够多,就可以减少读取次数,也就可以减少IO交互次数,也就是读取磁盘的次数.


MySQL 中的数据文件,是以page为单位保存在磁盘当中的

MySQL 的 CURD 操作,都需要通过计算,找到对应的插入位置,或者找到对应要修改或者查询的数据。

而只要涉及计算,就需要CPU参与,既然有CPU参与,就一定要能够先将数据移动到内存当中。

所以在特定时间内,数据一定是磁盘中有,内存中也有。后续操作完内存数据之后,以特定的刷新策略,刷新到磁盘。而这时,就涉及到磁盘和内存的数据交互,也就是IO了。而此时IO的基本单位就是Page。

为了更好的进行上面的操作, MySQL 服务器在内存中运行的时候,在服务器内部,就申请了被称为 Buffer Pool 的的大内存空间,来进行各种缓存。和磁盘数据进行IO交互

为何更高的效率,一定要尽可能的减少系统和磁盘IO的次数

于是现在出现了第一版最easy数据结构, 管理这些page:  你瞅瞅可以不.

知道是啥了吧。对对对就是它. 双向循环list。如下是更细节的图.

上述这样的存储结构.  是用来存储记录的, 也就是存储数据的,在数据量很少的情况下.这样是没多大问题的

可是数据量达到一定程度的时候. 线性的查找每一页, IO交互的次数也会很多. 效率很低下.

索引底层数据结构B+树

于是乎.  索引B+树这个结构出现了.  (为页添加目录的形式. 有点像. 上层页是下层页的目录.)

只有叶子结点会存储真正的记录信息. 上面的页都是存储的索引值 + 索引值对应的页的地址.

B+树的特征.   树宽大,但是高度低。 好处是啥?  查找页数少. 加载磁盘page到内存的磁盘IO次数少. 效率高.

B+树(聚集索引)

  1. 使用主键为key值构建B+树
  2. 除了叶子结点, 上面的所有结点都存储的是目录页. 只有叶子结点存储的是数据页.(实实在在的记录,行数据).
  3. 目录页只放各个下级Page的最小键值, 键值从左到右依次增大
  4. 最下面一层叶子结点. 采用双向链接. 构成双向循环链表.  why?

B+树(辅助索引)

辅助索引还是构成的B+树. 但是和上述不同的是. 辅助索引构成B+树的叶子结点中存储的不是行数据. 而是聚簇索引值 (主键值), 然后通过这个主键值到聚簇索引B+树种去查询,操作

为什么要这样?  保证数据的一致性, 和保证全局仅存储一份数据.  

辅助索引也按照B+树结构组织起来, 是为了降低磁盘IO.  但是它的叶子结点中不是行数据,只有对应的主键,再回表到聚簇索引B+树中去查找操作.   (回表查询操作)

思考一下为何使用B+树结构, 不是B树, 不是平衡树二叉树,红黑树?

不采用红黑树 + AVL树原因在于树高的问题.  树高越高,进行的IO交互次数, 磁盘IO的次数越多.效率越低.


那为何使用B+树而不使用B树?


因为首先B树对比B+树. B+树是所有的数据全部分布在叶子结点上. 而B树不一样, 它是数据结点分布在整棵树.


所以弊端1出现了. B树的树高会高于B+树


非叶子节点不存储data,这样一个节点就可以存储更多的key。可以使得树更矮,所以IO操作次数更少。

叶子节点相连,更便于进行范围查找

索引总结

索引对应的底层数据结构是B+树.  数据存储在主键构成的聚簇索引B+树的叶子结点

使用索引B+树的优势在于提高查询效率.

索引尽量短小. B+树结点可以存储更多的  下层结点, 降低B+树树高.

查询频次较高且数据量大的表建立索引;索引选择使用频次较高,过滤效果好的列或者组合

尽量扩展索引,在现有索引的基础上,添加复合索引

不要 select * ; 尽量只列出需要的列字段

索引列,列尽量设置为非空


相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
存储 SQL 关系型数据库
MySQL进阶突击系列(03) MySQL架构原理solo九魂17环连问 | 给大厂面试官的一封信
本文介绍了MySQL架构原理、存储引擎和索引的相关知识点,涵盖查询和更新SQL的执行过程、MySQL各组件的作用、存储引擎的类型及特性、索引的建立和使用原则,以及二叉树、平衡二叉树和B树的区别。通过这些内容,帮助读者深入了解MySQL的工作机制,提高数据库管理和优化能力。
|
2月前
|
SQL 关系型数据库 MySQL
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
MySQL慢查询优化、索引优化,是必知必备,大厂面试高频,本文深入详解,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
|
17天前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
MySQL事务日志-Undo Log工作原理分析
|
13天前
|
SQL 关系型数据库 MySQL
MySQL派生表合并优化的原理和实现
通过本文的详细介绍,希望能帮助您理解和实现MySQL中派生表合并优化,提高数据库查询性能。
51 16
|
27天前
|
SQL 存储 关系型数据库
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
本文详细介绍了MySQL中的SQL语法,包括数据定义(DDL)、数据操作(DML)、数据查询(DQL)和数据控制(DCL)四个主要部分。内容涵盖了创建、修改和删除数据库、表以及表字段的操作,以及通过图形化工具DataGrip进行数据库管理和查询。此外,还讲解了数据的增、删、改、查操作,以及查询语句的条件、聚合函数、分组、排序和分页等知识点。
【MySQL基础篇】全面学习总结SQL语法、DataGrip安装教程
|
11天前
|
存储 SQL 关系型数据库
MySQL 面试题
MySQL 的一些基础面试题
|
14天前
|
SQL 关系型数据库 MySQL
MySQL派生表合并优化的原理和实现
通过本文的详细介绍,希望能帮助您理解和实现MySQL中派生表合并优化,提高数据库查询性能。
33 7
|
12天前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(05)突击MVCC核心原理 | 左右护法ReadView视图和undoLog版本链强强联合
2024年小结:感谢阿里云开发者社区每月的分享交流活动,支持持续学习和进步。过去五个月投稿29篇,其中17篇获高分认可。本文详细介绍了MySQL InnoDB存储引擎的MVCC机制,包括数据版本链、readView视图及解决脏读、不可重复读、幻读问题的demo演示。
|
1月前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
102 5
|
1月前
|
Java 关系型数据库 数据库
京东面试:聊聊Spring事务?Spring事务的10种失效场景?加入型传播和嵌套型传播有什么区别?
45岁老架构师尼恩分享了Spring事务的核心知识点,包括事务的两种管理方式(编程式和声明式)、@Transactional注解的五大属性(transactionManager、propagation、isolation、timeout、readOnly、rollbackFor)、事务的七种传播行为、事务隔离级别及其与数据库隔离级别的关系,以及Spring事务的10种失效场景。尼恩还强调了面试中如何给出高质量答案,推荐阅读《尼恩Java面试宝典PDF》以提升面试表现。更多技术资料可在公众号【技术自由圈】获取。