当前位置: 首页 > news >正文

技术总结(四十三)

1 索引介绍

1.1 什么时MySQL的索引

MySQL官方对于索引的定义:索引是帮助MySQL高效获取数据的数据结构。
​MySQL在存储数据之外,数据库系统中还维护着满足特定查找算法的数据结构,这些数据结构以某种引用(指向)表中的数据,这样我们就可以通过数据结构上实现的高级查找算法来快速找到我们想要的数据。而这种数据结构就是索引。
​简单理解为“排好序的可以快速查找数据的数据结构”。

1.2 索引数据结构

1.⼆叉树查找

​ 我们都学过⼆分查找,如果我们⼀开始在插⼊数据就将数据按顺序排列,那查找效率就会⼤⼤提⾼。将数据按照顺 序⼆叉树排列好每次查询就可以使⽤⼆分法即从根节点出发,查询效率就增加了

但是如果删除了⼀些数据⽐如0,6,1,3,4删除了那么右边的数据就有变成了线性的了,查询效率就会浪费

2 平缓二叉树

​ 如果有这样⼀棵树左右⼦树⾼度差不超过 1,⽽且也满⾜顺序排列就可以继续⾼效下去,然后平衡⼆叉树就出现 了。每当删除⼀个节点都应该发⽣相应的节点位置转换反转保证⼆叉树的平衡。

我们⽆⾮就是想让查找效率变高,从线性的 O(n) 到 O (logn),为什么不⽤更⾼效的 Hash 地址法来查找呢?这样可以降到 O(1),答案是在查询过程中我们不仅有等值查询还有范围查询 模糊查 询,使⽤ Hash 存储其位置的不确定性,如果要查询 范围我们就要遍历全表。⽽⼆叉树只要遍历左右节点。

3.B树

 由于平衡⼆叉树的⼆叉特点,它每⼀个节点最多只有 2 个叉,假设有 100000 个数据,那么树的深度将会变得特别 深,⽽每次⽐较就是拿⽐较的树和节点上的数在内存⽐较,所以每⽐较⼀次就是⼀次 IO 操作就下降⼀层,层数越 多时间就越久。所以B树就来了,他是多叉平衡树,每个节点维护了多个⽐较范围(即⼦节点)

 这样就降低了⾼度,每个圆圈可以理解为⼀⻚,16kb的数据. 所以他的每个节点都存储数据就会造成每个结点的分 叉数减少,⽽且会造成先靠近根节点的先查到,靠近叶⼦结点的后查到。同样范围查找也会出现多次回退到⽗节点 在到另⼀个兄弟节点的低效率问题。

4.B+树

​ 我们改造⼀下 B树 为 B + 树 ,每个⾮叶⼦节点只存索引,真实数据都存在叶⼦节点,这样⾮叶⼦节点的空间 单个 数据空间 减少 数量即分叉就可以增⼤。每次查询⽆论如何必须遍历到叶⼦节点才会结束,这样深度⼜减少了,同 时我们把每个叶⼦结点⽤双向链表连接起来,范围查询就更快。

1.3 索引优势

​ 提高数据检索的效率,降低数据库的Io成本。
​ 通过索引对数据进行排序,降低数据排序的成本,降低了CPU的消耗。

1.4 索引劣势

索引实际上也是一张表,保存了主键和索引的字段,并且指向实体表的记录,所以索引也索引实际上也是一张表,保存了主键和索引的字段,并且指向实体表的记录,所以索引也是需要占用空间的。在索引大大提高查询速度的同时,却会降低表的更新速度,在对表进行数据增删改的同时,MySQL 不仅要更新数据,还需要保存一下索引文件。每次更新添加了的索引列的字段,都会去调整因为更新带来的减值变化后的索引的信息。

1.5 索引使用场景

1.主键自动建立唯一索引

2.频繁作为查询条件的字段应该创建索引(where后面的语句)

3.查询中与其它表关联的字段,外键关系建立索引

4.多字段查询下倾向创建组合索引

5.查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度

6.查询中统计或者分组字段

那些情况不推荐建立索引:

1.表记录太少

2.经常增删改的表

3.where条件里用不到的字段

http://www.lryc.cn/news/496011.html

相关文章:

  • mac终端自定义命令打开vscode
  • 代码设计:设计模式:应对变化
  • Proteus中添加新元件库
  • Hive学习基本概念
  • 运维工程师.云计算工程师面试题.考试题
  • 四、初识C语言(4)
  • 解决爬虫ConnectionResetError出现的问题
  • Qt桌面应用开发 第十天(综合项目二 翻金币)
  • vue跳转以及传参
  • Meta Reality Labs的VR/AR投资战略转向:内部视角与市场影响
  • animate.css和wow.js结合使用实现动画效果
  • 【大模型】ChatGPT 提示词优化进阶操作实战详解
  • 网络安全:攻击和防御练习(全战课), DDos压力测试
  • 【落羽的落羽 C语言篇】指针·之其五
  • go的web框架介绍
  • 基于群晖搭建个人图书架-TaleBook based on Docker
  • redis哨兵安装部署
  • JVS低代码里表单与表格不同数据关联场景的实现方法
  • NaviveUI框架的使用 ——安装与引入(图标安装与引入)
  • Cannot resolve symbol ‘ActivityThread‘ | Android 语法
  • OpenSSH-9.9p1 OpenSSL-3.4.0 升级步骤详细
  • python 练习题
  • 数学建模——Topsis法
  • Electron-vue 框架升级 Babel7 并支持electron-preload webapck 4 打包过程记录
  • github仓库自动同步到gitee
  • 汽车仪表板可识别安全气囊,安全带,ABS,邮箱,灯等多种告警参数,YOLO,VOC,COCO三种方式标记的数据集整理
  • springboot370高校宣讲会管理系统(论文+源码)_kaic
  • GoReplay开源工具使用教程
  • UE4_材质节点_有关距离的_流体模拟
  • 虚拟现实(VR)与增强现实(AR)有什么区别?