九、索引与执行计划、索引的分类
索引与执行计划
- 索引入门
- 生活中的索引
- MySql 中的索引
- 谈下 B+Tree
- 二分查找
- 二叉树(Binary Tree)
- 平衡二叉树(AVL-树)
- 平衡二叉树的遍历
- 平衡二叉树的旋转
- B+树
- B+树的定义
- B+树的作用
- B+树的插入操作
- 索引的分类
- 基础语法
上篇-mysql gap锁与慢查询
索引入门
###索引是什么
生活中的索引
MySQL 官方对索引的定义为:索引(Index)是帮助 MySQL 高效获取数据的数据结构。 可以得到索引的本质:索引是数据结构。
上面的理解比较抽象,举一个例子,平时看任何一本书,首先看到的都是目录,通过目录去 查询书籍里面的内容会非常的迅速。
上图就是一本金瓶梅的书,书籍的目录是按顺序放置的,有第一节,第二节它本身就是一种 顺序存放的数据结构,是一种顺序结构。 另外通过目录(索引),可以快速查询到目录里面的内容,它能高效获取数据,通过这个简 单的案例可以理解所以就是高效获取数据的数据结构。
再来看一个复杂的情况
我们要去图书馆找一本书,这图书馆的书肯定不是线性存放的,它对不同的书籍内容进行了 分类存放,整索引由于一个个节点组成,根节点有中间节点,中间节点下面又由子节点,最 后一层是叶子节点, 可见,整个索引结构是一棵倒挂着的树,其实它就是一种数据结构,这种数据结构比前面讲 到的线性目录更好的增加了查询的速度。
MySql 中的索引
MySql 中的索引其实也是这么一回事,我们可以在数据库中建立一系列的索引,比如创建主 键的时候默认会创建主键索引,上图是一种 BTREE 的索引。每一个节点都是主键的 ID 当我们通过 ID 来查询内容的时候,首先去查索引库,在到索引库后能快速的定位索引的具 体位置。
谈下 B+Tree
要谈 B+TREE 说白了还是 Tree,但谈这些之前还要从基础开始讲起
二分查找
二分查找法(binary search) 也称为折半查找法,用来查找一组有序的记录数组中的某一记 录。其基本思想是:将记录按有序化(递增或递减)排列,在查找过程中采用跳跃式方式查找, 即先以有序数列的中点位置作为比较对象,如果要找的元素值小于该中点元素,则将待查序 列缩小为左半部分,否则为右半部分。通过一次比较,将查找区间缩小一半。
给出一个例子,注意该例子已经是升序排序的,且查找 数字 48
数据:5, 10, 19, 21, 31, 37, 42,48, 50, 52
下标:0, 1, 2 ,3 , 4, 5, 6, 7, 8, 9步骤一:设 low 为下标最小值 0 , high 为下标最大值 9 ;
步骤二:通过 low 和 high 得到 mid ,mid=(low + high) / 2,初始时 mid 为下标 4 (也 可以=5,看具体算法实现);
步骤三 : mid=4 对应的数据值是 31,31 < 48(我们要找的数字);
步骤四:通过二分查找的思路,将 low 设置为 31 对应的下标 4 , high 保持不变为 9 , 此时 mid 为 6 ;
步骤五 : mid=6 对应的数据值是 42,42 < 48(我们要找的数字);
步骤六:通过二分查找的思路,将 low 设置为 42 对应的下标 6 , high 保持不变为 9 , 此时 mid 为 7 ;
步骤七 : mid=7 对应的数据值是 48,48 == 48(我们要找的数字),查找结束; 通过 3 次 二分查找 就找到了我们所要的数字,而顺序查找需 8
二叉树(Binary Tree)
每个节点至多只有二棵子树;
- 二叉树的子树有左右之分,次序不能颠倒;
- 一棵深度为 k,且有 个节点,称为满二叉树(Full Tree);
- 一棵深度为 k,且 root 到 k-1 层的节点树都达到最大,第 k 层的所有节点都 连续集中 在 最左边,此时为完全二叉树(Complete Tree)
平衡二叉树(AVL-树)
- 左子树和右子树都是平衡二叉树;
- 左子树和右子树的高度差绝对值不超过 1;
非平衡二叉树
平衡二叉树的遍历
- 前序 :6 ,3, 2, 5,7, 8(ROOT 节点在开头, 中 -左-右 顺序)
- 中序 :2, 3, 5, 6,7, 8(中序遍历即为升序,左- 中 -右 顺序)
- 后序 :2, 5, 3, 8,7, 6 (ROOT 节点在结尾,左-右- 中 顺序)
平衡二叉树的旋转
需要通过旋转(左旋,右旋)来维护平衡二叉树的平衡,在添加和删除的时候需要有额外的 开销。
B+树
B+树的定义
- 数据只存储在叶子节点上,非叶子节点只保存索引信息;
- 非叶子节点(索引节点)存储的只是一个 Flag,不保存实际数据记录;
- 索引节点指示该节点的左子树比这个 Flag 小,而右子树大于等于这个 Flag
- 叶子节点本身按照数据的升序排序进行链接(串联起来);
- 叶子节点中的数据在 物理存储上是无序 的,仅仅是在 逻辑上有序 (通过指针串在一 起);
B+树的作用
- 在块设备上,通过 B+树可以有效的存储数据;
- 所有记录都存储在叶子节点上,非叶子(non-leaf)存储索引(keys)信息;
- B+树含有非常高的扇出(fanout),通常超过 100,在查找一个记录时,可以有效的减 少 IO 操作;
B+树的扇出(fan out)
- 该 B+ 树高度为 2
- 每叶子页(LeafPage)4 条记录
- 扇出数为 5
- 叶子节点(LeafPage)由小到大(有序)串联在一起
扇出 是每个索引节点(Non-LeafPage)指向每个叶子节点(LeafPage)的指针
扇出数 = 索引节点(Non-LeafPage)可存储的最大关键字个数 + 1
图例中的索引节点(Non-LeafPage)最大可以存放 4 个关键字,但实际使用了 3 个;
B+树的插入操作
- B+树的插入
B+树的插入必须保证插入后叶子节点中的记录依然排序。
https://blog.csdn.net/shenchaohao12321/article/details/83243314
索引的分类
普通索引:即一个索引只包含单个列,一个表可以有多个单列索引
唯一索引:索引列的值必须唯一,但允许有空值
复合索引:即一个索引包含多个列
聚簇索引(聚集索引):并不是一种单独的索引类型,而是一种数据存储方式。具体细节取决 于不同的实现,InnoDB 的聚簇索引其实就是在同一个结构中保存了 B-Tree 索引(技术上来说 是 B+Tree)和数据行。
非聚簇索引:不是聚簇索引,就是非聚簇索引
基础语法
查看索引
SHOW INDEX FROM table_name\G
创建索引
CREATE [UNIQUE ] INDEX indexName ON mytable(columnname(length)); ALTER TABLE 表名 ADD [UNIQUE ] INDEX [indexName] ON (columnname(length))
删除索引
DROP INDEX [indexName] ON mytable;
九、索引与执行计划、索引的分类相关推荐
- MySQL 的索引、执行计划、优化器算法
SQL处理流程 INDEX 索引 索引介绍 索引:是排序的快速查找的特殊数据结构,定义作为查找条件的字段上,又称为键key,索引通过存储引擎实现: 索引相当于一本书的目录,可以优化查询. 优点: 索引 ...
- mysql 配置执行计划_MySQL深入学习(二)--配置、索引、执行计划
MySQL 一.MySQL 5.7 初始化配置 1.初始化数据并配置 # 1.初始化数据 /usr/local/mysql/bin/mysqld --initialize-insecure --use ...
- eclipse的servlet默认不执行index_MySQL之索引及执行计划分析
mysql官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构. 索引的本质:索引是数据结构.索引就是排好序的快速查找数据结构一般来说索引本身也很大不可能全部存储在内存中,因此 ...
- mysql的索引和执行计划
一.mysql的索引 索引是帮助mysql高效获取数据的数据结构.本质:索引是数据结构 1:索引分类 普通索引:一个索引只包含单个列,一个表可以有多个单列索引. 唯一索引:索引列的值必须唯一 ,但允许 ...
- MySQL之索引,执行计划及SQL优化
1.1 索引的分类 从功能逻辑上说,分为普通索引,唯一索引,主键索引,全文索引 从物理实现方式上说,分为聚簇索引,非聚簇索引(2级索引) 从字段个数上来说,分为分为单列索引,联合索引 1.2 适合创建 ...
- Mongodb索引和执行计划 hint 慢查询
查询索引 索引存放在system.indexes集合中 > show tables address data person system.indexes 默认会为所有的ID建上索引 而且无法删除 ...
- oracle表关联为什么不走索引,Oracle执行计划不走索引的原因总结
51Testing软件测试网\2cGa+\2o 在操作中,为什么有时一个表的某个字段明明有索引,当观察一些语的执行计划确不走索引呢?如何解决呢?本文我们主要就介绍这部分内容,接下来就让我们一起来了解一 ...
- mysql索引创建规则、联合与一般索引、执行计划、索引选择,索引重建与下推
数据库索引怎么建,什么时候用到 索引优缺点:为主键外建where子句建立索引可以加速数据库查询,但是索引占用内存,同时update和insert的时候需要同步修改;索引的实现通常使用其变种B+树. 建 ...
- mysql 执行计划、索引、性能优化
一.逻辑架构 连接层:连接池.权限验证.服务器为每一个客户端请求创建一个线程或者分配一个空闲的线程(连接池),因此当多个请求(线程)共同操作同一个数据时可能会引起数据安全问题. 服务层:sql优化.缓 ...
最新文章
- 如何扩容单台服务器的存储容量?
- R语言Affinity Propagation+AP聚类实战
- Example017简单的下拉框
- python软件下载安装win10-Python Win10版本下载
- CSDN转载别人文章的详细步骤
- ASP.NET配置错误页面浅析
- 九歌计算机在线作诗硬件原理,“九歌”作诗是如何炼成的?
- puppet(2)-资源介绍
- excel首行空不能导入access_终于解决SQL Server 2008 64位系统无法导入Access/Excel的问题 2012/08/01...
- codeforces 762E(cdq分治)
- 【干货】10000个抖音短视频红人通讯录.pdf(附下载链接)
- 蓝桥杯 ALGO-157 算法训练 阶乘末尾
- Go语言学习路线图 初阶+中阶+高阶
- 在苹果系统MacOS上安装PowerDesigner16.5
- c语言中负数参与除法,C语言中负数除法与右移取整问题
- JS让网页字体大小随窗口大小改变而改变
- 计算机应用新媒体是什么,新媒体概念,什么是新媒体
- 图解LDO电路和DC-DC电路,掌握芯片选型
- 怎么评估计算机的执行速度,Win10在CMD下使用WinSAT进行评估电脑性能解决方法
- nodejs app.js详解
热门文章
- JavaScript:原型设计模式
- TypeScript学习(五):数组的定义方式及常见数组操作方法使用
- 代码规范七大原则_设计模式的七大原则详解||上篇
- spring cloud gateway Unhandled failure: Only one connection receive subscriber allowed.
- 心得复述知识体系:《强化学习》中的蒙特卡洛方法 Monte Carlo Methods in Reinforcement Learning
- lintcode :Count and Say 报数
- db设计专用excel_电磁兼容(EMC):工程师必备之硬件EMC设计规范
- Python使用线性回归简单预测数据
- ISE使用中RAM IP核配置及ram测试(两种测试)
- 【转】MongoDB介绍及下载与安装