MySQL索引的理解学习,面试不问索引原理就是事务原理
目录
MySQL执行SQL的整体流程
引言, MySQL索引底层学习原因
磁盘介绍(理解磁盘IO)
索引底层数据结构B+树
B+树(聚集索引)
B+树(辅助索引)
思考一下为何使用B+树结构, 不是B树, 不是平衡树二叉树,红黑树?
索引总结
MySQL执行SQL的整体流程
显示需要跟MYSQL Server 进行连接. 获取MySQL服务. 跟数据库进行交互.
connection Pool 连接池。提前创建多条连接通道. 新的连接请求到来就复用连接通道.
一条连接的建立对应一个线程的创建. 存在多线程并发操作数据库的问题.
--- 引出事务原理. 事务就是专门用来处理。 多连接并发时所产生的问题.
多线程 / 多连接同时对于 数据库进行写操作势必会产生什么? 脏数据
咋处理的, 无非是 MVCC + mutex. 此处如果想要细致了解的, 可以看如下文章.
mysql事务的理解学习, 面试不问索引原理就是事务原理_小杰312的博客-CSDN博客mysql事务的理解学习, 面试不问索引原理就是事务原理https://blog.csdn.net/weixin_53695360/article/details/124026899?spm=1001.2014.3001.5502然后连接建立好之后就是对于客户端发过来的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+树(聚集索引)
- 使用主键为key值构建B+树
- 除了叶子结点, 上面的所有结点都存储的是目录页. 只有叶子结点存储的是数据页.(实实在在的记录,行数据).
- 目录页只放各个下级Page的最小键值, 键值从左到右依次增大
- 最下面一层叶子结点. 采用双向链接. 构成双向循环链表. 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 * ; 尽量只列出需要的列字段
- 索引列,列尽量设置为非空
MySQL索引的理解学习,面试不问索引原理就是事务原理相关推荐
- mysql事务的理解学习, 面试不问索引原理就是事务原理
目录 事务理解 事务组成 事务特征 常见事务的控制语句 事务的ACID特征 原子性 (可借助多线程对全局数据做写入操作哪里的理解) 绑定操作单元 隔离性 持久性 (先写日志再写磁盘, 高效) 一 ...
- mysql s索引 树_mysql 学习 - B+树索引
我们已经知道在单一数据页中查找数据时, 如果查找条件是主键的话, 可以使用二分法定位槽, 然后顺序遍历槽中的数据查找指定数据. 但是我们并不知道如何在数以万计的页中定位数据在哪个页中, 在没有索引的情 ...
- oracle位图索引和普通索引区别,Oracle学习之位图索引
Oracle学习之位图索引 时间:2017-07-29 来源: 位图索引的原理 位图索引的优势 1.快速统计条数 由于位图索引只存储0和1的指,因此它的空间占用很小,向count(*)之类的操作用位图 ...
- 对数据库索引的理解及适合建立索引的字段
因本人小白,总结一下别人总结的,勿怪勿怪.转载深入浅出数据库索引原理,哪些字段适合建立索引 问题 为什么要给表加上主键? 为什么加索引后会使查询变快? 为什么加索引后会使写入.修改.删除变慢? 什么情 ...
- oracle执行计划没有执行索引,oracle理解执行计划之索引相关
一.什么是执行计划 所谓执行计划,就是在执行一个SQL前,做出的一份数据库认为最佳的方案.好比在北京上班,是做地铁去还是公交车亦或开车自驾等等.如果做地铁,需要从哪儿换成之类的,... ...从各种方 ...
- 框架学习之Hibernate 第十节 事务原理与分析
1.事务 两种事务: ① JDBC事务:单个数据库的事务 一个SesisonFactory对应一个数据库,使用 JDBC 实现 常用代码的模板: Session session = null;Tran ...
- Spring学习总结(26)——Spring事务原理详解
一.事务的基本原理 Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的.对于纯JDBC操作数据库,想要用到事务,可以按照以下步骤进行: (1).获 ...
- MySQL基础(二十八)索引优化与查询优化
都有哪些维度可以进行数据库调优?简言之: 索引失效.没有充分利用到索引--索引建立 关联查询太多JOIN (设计缺陷或不得已的需求)--SQL优化 服务器调优及各个参数设置(缓冲.线程数等)---调整 ...
- 面试 - 要不简单聊一下你对MySQL索引的理解?
转载自 面试 - 要不简单聊一下你对MySQL索引的理解? MySQL索引?这玩意儿还能简单聊?明显是在挖坑,幸好老夫早有准备,切听我一一道来. 一.索引是什么? 索引是帮助MySQL高效获取数据的 ...
最新文章
- javascript基础整理
- 服务器拒绝接收office文件,Ghost Win7系统下Outlook设置拒绝接收垃圾文件的方法
- MySQL Server has gone away报错原因汇总
- CentOS 7下宿主机使用virsh console访问KVM的设置
- python string模块template_Python - 定制pattern的string模板(template) 详解
- LeetCode 1481. 不同整数的最少数目(计数+排序+贪心)
- android byte转string_高性能AES256对称加解密,兼容Java、IOS、Android
- IDEA/Eclipse安装 Alibaba Java Coding Guidelines 插件
- Linux网络编程-TCPUDP测试工具下载和使用
- android 控制手机音量大小,android 控制手机音量的大小 切换声音的模式
- Mybatis起别名的方法
- 2015出现的25项最佳发明
- 玩数字域名投资有风险吗 风险与机遇并存
- C++报错illegal instruction
- VUE-waterfall瀑布流组件使用
- 如何调用阿里云、百度云API接口
- 玄武科技——前端面试题总结
- eclipse安装WindousBuilder为什么在项目里不显示
- 基于MATLAB程序设计的计算器(中)
- document在方法外获取对象无法获取数据
热门文章
- 无法访问网上邻居解决方法
- 正方形里面两个扇形相交部分_计算下图中阴影部分的面积,最简单的方法是用正方形的面积除以2...
- ARDUINO入门教程(二)基本传感器的使用
- CSS水平垂直居中: flex方式
- Python矩阵分解之QR分解
- 发那科机器人请关闭电源_发那科机器人报警处理(中文)
- 【R studio】R studio dta转xlsx
- “PPT中如何插入和提取swf文件”的解决方案
- STM32驱动RC522-RFID模块
- mybatis自动建表oracle,利用mybatis-generator自动生成代码 - 菩提树下的杨过 - 博客园...