MySQL进阶之索引
作者:兜兜转转m 发布时间:2024-01-23 11:54:09
索引概述
介绍
索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足 特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构 上实现高级查找算法,这种数据结构就是索引。
索引就是一种数据结构,这种结构类似,链表,树等等。但是比它们要复杂的多。
为什么要用索引呢?
假如我们有如下数据
如果我们要查询年龄=45的全部信息。
select * from tb_user where age = 45;
那么SQL是如何查询呢?
MySQL需要进行全表扫描,然后对比每条数据中的age值是否是45。
加入我们要100个数据,那你继续全表扫描找出age = 45;岂不是太麻烦了?
这是你是否想起来数据结构中二叉搜索树?我们将age的值映射到这个二叉搜索树上,那么我们就可以快速查找到我们要的结果。age 到二叉搜索树的过程就是索引。
注意:我们仅仅用二叉搜索树举例子,想信你肯定知道MySQL中的索引肯定比这个复杂。
此时我们对索引的理解更加深入了,索引仅仅是建立了一个数据结构,把数据存入到这个结构上,方便MySQL查找数据罢了。
特点
索引结构
MySQL的索引是在存储引擎层实现的,不同的存储引擎有不同的索引结构,主要包含以下几种
上述是MySQL中所支持的所有的索引结构,接下来,我们再来看看不同的存储引擎对于索引结构的支持 情况。
我们主要看InnoDB就可以了,因为MyISAM会被MongoDB代替,Memory会被Redis代替。
我们一般指的索引是指的是B+tree。
当然B+tree肯定不是一上来就提出来的,肯定是有一个进化的过程。
索引进化的过程
我们都知道二叉搜索树是一个方便存储的结构,因为其天然的排序。左子树都小于中间节点,右子树都大于中间节点。
但是它有什么缺点呢?在极端情况下会退化成链表。查找时间复杂度O(n),这不就等效于全表查询了?
如何克服呢?使用红黑树,因为它是一种平衡二叉树。可以避免出现链表这种极端情况。
那么是不是使用红黑树就可以了?答案:还是不行,不够理想。
为什么呢?因为是二叉树,如果MySQL中数据过多,那么将会出现树的层级过深。
我们知道数据以Page为单位存入的,在Page切换查询时会出现磁盘IO操作。层级过深就会造成IO频繁。
如何解决上述问题呢?B-Tree出场。
B-Tree
B-Tree,B树是一种多叉路衡查找树,相对于二叉树,B树每个节点可以有多个分支,即多叉。 以一颗最大度数(max-degree)为5(5阶)的b-tree为例,那这个B树每个节点最多存储4个key(每个key都可以存放数据),5 个指针:
是不是使用b树就可以了呢?原则上是可以了,但是还有一种更优的方案B+Tree 代替了BTree。
MySQL中的B+Tree 和BTree有什么不同呢?
B+Tree只在叶子节点存储数据,从而保证每个Page中存入更多的key。
叶子节点包含了根节点和非叶子节点--图中红框显示。
叶子节点采用双向循环链表连接,方便查找。
因此我们可以回答:为什么MySQL采用B+Tree呢?
来源:https://blog.csdn.net/abc123mma/article/details/127804116


猜你喜欢
- 版本号:Python2.7.5,Python3改动较大,各位另寻教程。所谓网页抓取,就是把URL地址中指定的网络资源从网络流中读取出来,保存
- 一、读取Excel文件使用pandas的read_excel()方法,可通过文件路径直接读取。注意到,在一个excel文件中有多个sheet
- 给定一个文件夹,使用Python检查给定文件夹下有无文件重复,若存在重复则删除主要涉及的知识点有:os模块综合应用glob模块综合应用利用f
- 方法说明: 同步版的 stat() 。方法返回一个stat数组对象,包含以下信息:(以下信息为案例中读取的文件信息,非默认值){
- 1、文件上传(input标签) (1)html代码(form表单用post方法提交)<input class="b
- 一、AIML是什么AIML全名为Artificial Intelligence Markup Language(人工智能标记语言),是一种创
- 免费手机号码归属地API查询接口和PHP使用实例分享最近在做全国性的行业分类信息网站,需要用到手机号归属地显示功能,于是就穿梭于各大权威站点
- 本文实例讲述了原生JavaScript实现的简单省市县 * 联动功能。分享给大家供大家参考,具体如下: * 联动是我们写表单时必不可少的,比如在
- 安装 SQL2000 时,系统经常会提示:操作被挂起,要求重新启动计算机,如图1: 图1重新启动后,再次安装时问题仍然存在。解决办
- 1.阈值化分割原理通过对图像的灰度直方图进行数学统计,选择一个或多个阈值将像素划分为若干类。一般情况下,当图像由灰度值相差较大的目标和背景组
- 本文实例讲述了Python3.6基于正则实现的计算器。分享给大家供大家参考,具体如下:# -*- coding:utf-8 -*-#!pyt
- PHP getName() 函数实例返回 XML 元素及其子元素的名称:<?php $xml=<<<XML<?
- HTTP-REFERER这个变量已经越来越不可靠了,完全就是可以伪造出来的东东。 以下是伪造方法:ASP/Visual Basic代码 di
- 实例如下: $(document).on("click",".admin-side-friend",
- MySQL行转列操作 所谓的行转列操作,就是将一个表的行信息转化为列信息,说着可能比较笼统,这里先举个例
- 这里以安装简单的nonebot库为例子欧克,简明扼要,拿走点赞哟:大家想要的豆瓣源如下:因为有几个,但在这里还是建议使用国内的豆瓣源,本人感
- 之前公司有个绘制实时盈利率折线图的需求,实现的还不错,今天来分享下vue+echarts实现动态折线图的方法。实现代码<templat
- 在开发过程中,经常会通过实例的vm.$refs(this.$refs)取得通过ref注册过的组件,并进行相应操作,但存在取不到元素的情况,其
- 前言本文主要给大家介绍了关于Python3列表方法的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧。1 使用[]或
- Python爬虫分析前言:计算机行业的发展太快了,有时候几天不学习,就被时代所抛弃了,因此对于我们程序员而言,最重要的就是要时刻紧跟业界动态