MySQL索引知识复习

在你享受工作舒适的同时,你的危机也已经在慢慢靠近

正确的创建合适的索引才是保证数据库性能保证的基础

1、索引的底层数据结构:hash,b树,b+树的区别,逐层分析为什么最后选用了b+树作为索引结构?

Mysql数据库索引的实现算法是基于B+树实现的。

数据库中数据查找的过程:MySQL 是基于磁盘的数据库系统,索引往往以索引文件的形式存储的磁盘上,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。

局部性原理与磁盘预读

由于磁盘的存取速度与内存之间鸿沟,为了提高效率,要尽量减少磁盘I/O.磁盘往往不是严格按需读取,而是每次都会预读,磁盘读取完需要的数据,会顺序向后读一定长度的数据放入内存。而这样做的理论依据是计算机科学中著名的局部性原理:

当一个数据被用到时,其附近的数据也通常会马上被使用
程序运行期间所需要的数据通常比较集中

由于磁盘顺序读取的效率很高(不需要寻道时间,只需很少的旋转时间),因此对于具有局部性的程序来说,预读可以提高I/O效率.预读的长度一般为页(page)的整倍数。

如果要使查询效率提高,我们就得想办法减低树的层级高度,树的层级高度越低,查询速度就越快

  • 二叉树:基本上都遵循左小右大的原则,最上层节点称之为跟节点,最下面的节点称之为叶子节点,也叫叶节点,中间的节点称之为枝节点
  • B树:二叉树的每个叶子结点只存储一个元素,导致树的高度太高,因此让一个节点存储多个元素,降低树的整体层级高度,从而减少少磁盘访问次数,优化查询速度
数据结构特点
B树

四路查找B树,何为四路,即每个节点中储存的元素数量数,也称为关键字数

1、非叶子节点的子节点数大于1,且小于或等于M,并且M大于1

2、所有子节点都是处于同一层级

3、非叶子节点里记录关键字、关键字的磁盘记录指针、指向其子节点指针

4、叶子节点里记录里关键字及关键字的磁盘记录指针,子节点指针为null

缺点:B树的子节点里记录里关键字及关键字的磁盘记录指针并且还有指向其子节点指针。当数据量很大时,整棵树的体量也会很大,每次读取到内存中的树的信息就会很大,消耗资源

B+树

B树和B+树,本质上都是一样的

1、B+树所有的根节点和枝节点上只保存关键字索引和其子节点指针2、所有的数据信息都被保存到了叶子节点,这样每个枝节点可以存储更多的数据,从而降低树的层级高度

3、所有叶子节点像是一个链表一样,指向右边的叶子节点,从而可以有效加快检索效率

4、如果需要遍历所有的数据,只需要遍历叶子节点链式结构即可

为什么使用 B+树

  1. B+树更适合外部存储,由于内节点无 data 域,一个结点可以存储更多的内结点,每个节点能索引的范围更大更精确,也意味着 B+树单次磁盘IO的信息量大于B-树,I/O效率更高。

  2. Mysql是一种关系型数据库,区间访问是常见的一种情况,B+树叶节点增加的链指针,加强了区间访问性,可使用在范围区间查询等,而B-树每个节点 key 和 data 在一起,则无法区间查找。

2、聚集索引、普通索引的区别、联系

3、索引建立的原则:

  • 列的离散性,离散度越大,建立索引后的访问效果越好
  • 最左匹配原则
  • 联合索引(多列索引、而不是多个索引)
  • 覆盖索引定义

  • 一条慢SQL查询where后面有很多的查询字段,我们该如何建立联合索引?遵循的原则:最左匹配原则>离散度高原则>最少空间原则
  • explain一条sql语句重点关注的列:type、possible kyes、rows
  • 表中有name索引,where name like 'abc%'会用到索引么?为什么?在查询优化阶段会到表中对索引列的数据进行采样,如果采样结果判断出该列的离散性太差,那么也可能导致不会走索引进而进行全表数据的扫描
  •  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/419126.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(1729):前端系列javascript之内容卡片布局

<template><view class"content"><view class"todo-header"><view class"todo-header_left"><text class"active-text">全部</text><text>10条</text></view><view class&q…

JAVA可阻塞队列-ArrayBlockingQueue

在前面的的文章&#xff0c;写了一个带有缓冲区的队列&#xff0c;是用JAVA的Lock下的Condition实现的&#xff0c;但是JAVA类中提供了这项功能&#xff0c;就是ArrayBlockingQueue, ArrayBlockingQueue是由数组支持的有界阻塞队列&#xff0c;次队列按照FIFO&#xff08;先进先…

面试必问之JVM

Java的一次编译到处运行背后&#xff1a;JVM从软件层面屏蔽了底层硬件、指令字节码的细节&#xff08;JVM充当了适配器的角色和功能&#xff09; JVM\JDK\JRE关系 2、JVM运行时数据区 所有学过的知识是用来推导新的未知的知识的&#xff0c;踏入社会要学会运用自己的知识能力去…

前端学习(1730):前端系列javascript之发布窗口布局上

index.vue <template><view class"content"><view class"todo-header"><view class"todo-header_left"><text class"active-text">全部</text><text>10条</text></view><v…

赵雅智:service_startService生命周期

案例演示 布局文件 <RelativeLayout xmlns:android"http://schemas.android.com/apk/res/android"xmlns:tools"http://schemas.android.com/tools"android:layout_width"match_parent"android:layout_height"match_parent"tools:co…

面试自我介绍整理

面试前&#xff1a; 我是***&#xff0c;***年毕业于****学校&#xff0c;目前就职于***公司&#xff0c;工作期间参与并开发了****项目&#xff1a; 项目为了解决****问题&#xff0c;项目的应用场景主要是街道、工业园区等等&#xff0c;项目的主要做成模块和组成部分有&am…

亚信科技笔试题

不清楚这道题是不是亚信科技的原创题目&#xff0c;貌似在网上看到微软的笔试也有这道题目。原题的是c语言解决的&#xff0c;考虑java熟练一些。自己就有java来写这道题的算法。 题目描写叙述&#xff1a;编写一个确定字符串在还有一个字符串中出现的次数的算法。比如字符串“…

什么是框架?spring mvc框架

框架&#xff1a; 框指的是其是一个框子&#xff0c;有约束性&#xff1b;架是指的其支撑性。IT中的框架主要指的为解决特定的一个开放性问题而设计的具有一定约束性的支撑结构。在次结构上可以根据具体问题安插、扩展更多的组成部分&#xff0c;从而迅速和方便的构建完整的解…

mysql批量生成修改表和列注释语句

当我们在一个数据库修改完备注后&#xff0c;需要将其导致另一个服务器上的数据库中&#xff0c;需要生成批量执行语句&#xff0c;方便操作&#xff0c;注意用change 或modified 进行列的属性修改时&#xff0c;没有写全的话会造成其它属性的丢失&#xff0c;如 t_users 表中有…

14 | 排序优化:如何实现一个通用的、高性能的排序函数?

问题&#xff1a;平时的开发中&#xff0c;我们都是直接使用这些现成的函数来实现业务逻辑中的排序功能。这些排序函数是如何实现的吗&#xff1f;底层都利用了哪种排序算法呢&#xff1f;比如 C 语言中 qsort()&#xff0c;C STL 中的 sort()、stable_sort()&#xff0c;还有 …

15 | 二分查找(上):如何用最省内存的方式实现快速查找功能?

思考题&#xff1a;假设有 1000 万个整数数据&#xff0c;每个数据占 8 个字节&#xff0c;如何设计数据结构和算法&#xff0c;快速判断某个整数是否出现在这 1000 万数据中&#xff1f;希望不要占用太多的内存空间&#xff0c;最多不要超过 100MB 二分思想 查找算法 …

16 | 二分查找(下):如何快速定位IP对应的省份地址?

问题&#xff1a;假设我们有 12 万条这样的 IP 区间与归属地的对应关系&#xff0c;如何快速定位出一个 IP 地址的归属地呢&#xff1f; 二分查找的变形问题&#xff1a; 变体一&#xff1a;查找第一个值等于给定值的元素 public int bsearch(int[] a, int n, int value) {int…

UVA 11557 - Code Theft (KMP + HASH)

UVA 11557 - Code Theft 题目链接 题意&#xff1a;给定一些代码文本。然后在给定一个现有文本&#xff0c;找出这个现有文本和前面代码文本&#xff0c;反复连续行最多的这些文本 思路&#xff1a;把每一行hash成一个值。然后对于每个文本计算最大匹配值&#xff0c;枚举后缀。…

上传图片预览,支持IE6

//说明&#xff1a;图片上传预览插件 //上传的时候可以生成固定宽高范围内的等比例缩放图//参数设置&#xff1a; //width 存放图片固定大小容器的宽 //height 存放图片固定大小容器的高 //imgDiv 页面DIV的JQuery的…

17 | 跳表:为什么Redis一定要用跳表来实现有序集合?

问题&#xff1a;如果数据存储在链表中&#xff0c;就真的没法用二分查找算法了吗&#xff1f;可以对链表进行“改造”&#xff0c;就可以支持类似“二分”的查找算法。 跳表 定义&#xff1a;对链表经过改造之后的数据结构叫做跳表&#xff08;Skip list&#xff09;&#x…

亲和数 杭电2040

古希腊数学家毕达哥拉斯在自然数研究中发现&#xff0c;220的所有真约数(即不是自身的约数)之和为&#xff1a; 1245101120224455110&#xff1d;284。 而284的所有真约数为1、2、4、71、 142&#xff0c;加起来恰好为220。人们对这样的数感到很惊奇&#xff0c;并称之为亲和数…

18 | 散列表(上):Word文档中的单词拼写检查功能是如何实现的?

问题引入 在 Word 里输入一个错误的英文单词&#xff0c;它就会用标红的方式提示“拼写错误”&#xff0c;Word 文本编辑器的拼写检查功能是如何实现的呢&#xff1f;散列表&#xff08;Hash Table&#xff09; 散列表 散列表定义&#xff1a;散列表的英文叫“Hash Table”&…

19 | 散列表(中):如何打造一个工业级水平的散列表?

问题引入&#xff1a;如何实现一个工业级的散列表&#xff1f; 主要要求&#xff1a; 设计一个合适的散列函数&#xff1b;定义装载因子阈值&#xff0c;并且设计动态扩容策略&#xff1b;选择合适的散列冲突解决方法。 对于动态散列表来说&#xff0c;不管我们如何设计散列函…