MySQL的索引(优缺点,二叉树,红黑数,B+Tree)【详解】

1.什么是索引

索引:是用于提高查询数据性能的一种数据结构。实际开发中,对数据的读写操作大概是10:1

  • 把索引理解为目录。

  • 构建索引的过程,就是构建目录的过程

  • 构建索引的过程中会对数据进行排序

2.索引的优缺点

优点:

  • 可以极大的提升查询数据的速度

  • 可以帮助进行数据排序

缺点:

  • 索引也会占用存储空间

  • 索引会影响增、删、改的性能

3.什么字段适合加索引

适合添加索引的情况:

  1. 经常作为查询条件的字段

  2. 用于和其它表关联的字段:外键字段

  3. 经常用来排序的字段:构建索引时,MySQL会对数据进行排序

  4. 值的重复率低的字段:比如身份证号字段适合加索引;性别字段不适合加索引

不适合添加索引的情况:

  1. 值的重复率高的字段:比如性别

  2. 频繁更新的字段

  3. 值过大的字段:比如有一个字段类型 varchar(60000)

  4. 值无序的字段:值变化时,索引需要重新排序

4. 索引的数据结构

数据结构可视化地址:https://www.cs.usfca.edu/~galles/visualization/

好处:

  • 大部分情况下,查找数据的速度,会比全表扫描要快

问题:

  • 二叉树没有自平衡的效果,极端情况可能变成单链表。之后查找数据又变成全表扫描了

  • 一个节点最多只能有2个子节点,如果数据特别多,树的层级会非常深,导致IO次数多,影响查询速度

5.平衡二叉树-红黑树组织索引值

好处:

  • 这种算法会进行树的染色与旋转,保证树的平衡:左右子树的高度差,最大是2倍,不可能形成单链表

缺点:

  • 一个节点最多有2个子节点,如果数据量特别大,树的层级就会非常深。查找数据时IO的次数就会多,查找的性能就会降低

        

6.B-Tree

特点:

  • 每个节点允许有多个子节点

  • 能够通过分裂和自旋,尽可能的减少树的层级,实现树的平衡

好处:

  • 树的层级更浅,IO次数就更少

  • 不会退化成单链表

缺点:

  • 查询速度不稳定。有些数据在根节点上,有些数据在叶子节点上,每个节点上都有数据

  • 树的层级还不够浅。MySQL的每个节点16KB,一个节点里存储的有索引值还有对应的数据,那么下级节点数量就少,导致树的层级不够浅

7.B+Tree组织索引值

B+Tree组织索引值的结构:

  • 每个节点,空间大小是以“页”为单位。默认一页16KB

  • 节点存储的内容:

    • 非叶子节点只存储:索引值和下级节点的地址,不保存数据

    • 叶子节点才会存储:索引值和每一行的数据

    目的是:让非叶子节点可以有更多的子节点,从而降低树的深度

  • 所有的叶子节点之间,构建成双向链表:方便进行范围查询

  • 所有的数据都已经帮我们做好了排序

面试问题到:如果一张表大概1000W条数据,MySQL里索引树的深度有多少?大概3~4层,                               如果叶子节点在内存里,不需要加载,IO加载次数大概2-3层

这里图片的非叶子节点是3个开始,项目里是根据数据进行的算法分析

8. 索引语法

1.语法

  • 创建索引:create index 索引名 on 表名(字段,字段,..)

  • 查询索引:show indexes from 表名 或者 show index from 表名

  • 删除索引:drop index 索引名 on 表名

2.示例

#给tb_emp表里name字段添加索引
create index idx_name on tb_emp(name);
#查询一张表有哪些索引
show indexes from tb_emp;
#删除索引
drop index idx_name on tb_emp;

演示图:

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

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

相关文章

基于逻辑回归与决策树的地质灾害预测

大家好,我是带我去滑雪! 地质灾害的预测对于人们的生命财产安全、社会稳定和经济发展具有重要意义。地质灾害如地震、泥石流、山体滑坡等往往会造成严重的人员伤亡和财产损失。大规模的地质灾害往往会导致社会秩序混乱、人员流动、灾民避难等问题&#x…

pip 和conda 更换镜像源介绍

1、前言 很多深度学习的项目免不了安装库文件、配置环境等等,如果利用官方提供的连接,网速很慢,而且很容易download掉。 所以配置好了虚拟环境,将pip换源属实重要 常见的国内镜像源有清华、中科大、阿里等等... 这里建议用中科…

在亚马逊云EC2上启动PopOS

CloudEndure遇到的挑战 自从使用CloudEndure导入win11后就一发不可收拾,然后就可以尝试新的操作系统,比如system76的Pop!_OS,虽然上是基于ubuntu进行开发的,但是在使用安装CloudEndure 的时候还是遇到的了问题,可能是因为内核很新,也可能其他的一些原因. 如果说严格按照兼容性…

力扣977. 有序数组的平方

思路:暴力法:全部平方,然后调用排序API,排序算法最快是N*log(N)时间复制度。 双指针法:要利用好原本的数组本就是有序的数组这个条件, 只是有负数 导致平方后变大了,那么平方后的最大值就是在两…

算法时空复杂度分析:大O表示法

文章目录 前言大O表示法3个时间复杂度分析原则常见的时间复杂度量级空间复杂度参考资料 前言 算法题写完以后,面试官经常会追问一下你这个算法的时空复杂度是多少?(好像作为一名算法工程师,我日常码代码的过程中,并没…

mineadmin 快速安装部署(docker环境)

前提条件:已安装docker 一、下载dnmp环境包 github地址:https://github.com/tomorrow-sky/dnmp gitee地址: https://gitee.com/chenjianchuan/dnmp 二、看一下dnmp包目录结构 三、打开docker-compose.yml 文件,将不需要…

Node.js入门基础—day01

个人名片: 😊作者简介:一名大二在校生 🤡 个人主页:坠入暮云间x 🐼座右铭:给自己一个梦想,给世界一个惊喜。 🎅**学习目标: 坚持每一次的学习打卡 文章目录 初识node.js什…

网络工程师笔记14

VLAN原理与配置 VLAN 的功能 划分广播域,隔离广播域 VLAN的应用划分 VLAN配置命令

RTX4090上运行Cuda10.1报错:ValueError: Unknown CUDA arch (8.9) or GPU not supported

原因是cuda(我这里是cuda10.1,改为支持7.5)的版本不支持当前算力(8.9) 参考compute capability的官方表格:https://developer.nvidia.com/cuda-gpus 修改算力过程: sudo vim ~/.bashrc # 在配置文件中添加如下一行 exp…

微信怎么定时群发消息,一键群发5000好友?

对微信运营的人来说,群发是一件很有必要的事情,但是用微信群发的话,微信自带的群发助手只能发送文字和图片消息,一次只能选200个人,而且也无法定时群发,有很多不方便的地方,这个时候&#xff0c…

简单的思考(一):MATLAB实现心形线

今天刷B站的时候看见了: 于是想着自己能不能也做出来 clc;clear; % 定义x的范围 x -2:0.01:2;% 初始化图形 figure; set(gcf,position,[0,0,800,600],color,w); h1 plot(x,abs(x).^(2/3) (0.9*sqrt((3.3-x.^2))).*sin(0.1*pi*x),r,LineWidth,3); hold on xlim(…

Flutter 开发中踩坑笔记总汇

Flutter 踩坑笔记总汇 本篇主要是收集汇总开发过程中遇到的小困惑,都是些比较常见的问题。后续开发中遇到,也会持续更新在这里。 1、Flutter Packages upgrade后任务进入阻塞状态 问题:无法更新下载插件库。 解决:配置flutter官…

力扣(103、236、104)

103. 二叉树的锯齿形层序遍历 题目大意:将原先的层次遍历改为蛇形遍历,那么我们需要在102. 二叉树的层序遍历的基础上进行改进,首先蛇形走位(先从左往右,再从右往左进行下一层遍历,以此类推,层…

k8s部署InfluxDB

(作者:陈玓玏) 1. 拉取镜像 docker pull influxdb #拉取镜像 docker run -d influxdb:latest #后台运行容器 docker exec -it 89b /bin/bash #进入容器,89b是容器ID的前三位 cd /usr/bin #进入容器后,进入此文件夹…

SEO是什么?网站为什么要做SEO?#川圣SEO#蜘蛛池

baidu搜索:如何联系八爪鱼SEO? baidu搜索:如何联系八爪鱼SEO? baidu搜索:如何联系八爪鱼SEO? SEO,即搜索引擎优化,是一种通过了解和利用搜索引擎的运作规则来提高网站在搜索结果中…

Flink技术简介与入门实践

架构简介 Flink 是一个分布式流处理和批处理计算框架,具有高性能、容错性和灵活性。下面是 Flink 的架构概述: JobManager:JobManager 是 Flink 集群的主节点,负责接收和处理用户提交的作业。JobManager 的主要职责包括&#xff1…

Tomacat下载并且手动自动部署Web项目

Tomacat下载并且手动自动部署Web项目 Tomcat的简介Tomcat的作用Tomcat的下载Tomcat 部署1、环境准备2、手动部署项目3、自动部署项目(IDEA) ⭐ 前言 ⭐ 本篇文章主要介绍 Tomacat下载部署Web项目的详细使用以及部分理论知识 Tomcat的简介 Tomcat 服务…

硬盘分区怎么恢复数据 硬盘分区如何恢复原来的数据

硬盘分区是我们在使用电脑时经常会遇到的问题,而且很多人都会因为误操作或者其他原因导致硬盘分区数据丢失。这时候,我们就需要知道如何恢复硬盘分区的数据了。 首先,我们需要知道硬盘分区数据丢失的原因。一般来说,硬盘分区数据丢…

setTimeout+Promise+Async输出顺序?

注明:本文不涉及Nodejs执行机制 同步 && 异步 什么是异步,什么是同步,我不多说,我就通过小故事来讲讲吧。 同步:你打电话去书店订书,老板说我查查,你不挂电话在等待,老板把…

Memcached 数据库介绍

一 Memcached 介绍 (一)Memcached 简单介绍 弊端 不能持久化 (不支持存在硬盘里) Memcached 只支持能序列化的数据类型,不支持持久化,基于Key-Value的内存缓存系统 memcached 虽然没有像redis所具备的…