面向面试知识--MySQL数据库与索引

2023-09-18 11:11:43

面向面试知识–MySQL数据库与索引

优化难点与面试点

什么是MySQL索引?

索引的MySQL官方定义:索引是帮助MySQL快速获取数据的数据结构。

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

索引的分类

逻辑分类:

按照功能划分
  1. 主键索引:一张表只能有一个主键索引,不允许重复、不允许为null;
  2. 唯一索引:数据列不允许重复,允许为 NULL 值,一张表可有多个唯一索引,索引列的值必须唯一,但允许有空值。如果是组合索引,则列值的组合必须唯一。
  3. 普通索引:一张表可以创建多个普通索引,一个普通索引可以包含多个字段,允许数据重复,允许 NULL 值插入;(阿里开发者手册:高并发场景的表,索引数量控制在五个以内)
  4. 全文索引:它查找的是文本中的关键词,主要用于全文检索。(篇幅较长,下文有独立主题说明)
按照列数划分
  1. 单列索引:一个索引只包含一个列,一个表可以有多个单例索引。
  2. 组合索引:一个组合索引包含两个或两个以上的列。查询的时候遵循 mysql 组合索引的 “最左前缀”原则,即使用 where 时条件要按照建立索引的时候字段的排列方式放置索引才会生效。(索引失效的坑

物理分类:

聚簇索引

聚簇是为了提高某个属性(或属性组)的查询速度,把这个或这些属性(称为聚簇码)上具有相同值的元组集中存放在连续的物理块。

聚簇索引(clustered index)不是单独的一种索引类型,而是一种数据存储方式。这种存储方式是依靠B+树来实现的,根据表的主键构造一棵B+树且B+树叶子节点存放的都是表的行记录数据时,方可称该主键索引为聚簇索引。聚簇索引也可理解为将数据存储与索引放到了一块,找到索引也就找到了数据。
优点
(查询和更新快)

  • 数据访问速度快,因为聚簇索引将索引和数据都放在同一棵B+树,因此聚簇索引中获取数据比飞聚簇索引更快;
  • 聚簇索引对于主键的排序查找和范围查找速度非常快。
    缺点
    (删除和插入慢)
  • 插入速度严重依赖于插入顺序;插入速度严重依赖于插入顺序,按照主键的顺序插入是最快的方式,否则将会出现页分裂,严重影响性能。因此,对于InnoDB表,我们一般都会定义一个自增的ID列为主键主键列不要选没有意义的自增列,选经常查询的条件列才好,不然无法体现其主键索引性能);
  • 更新主键代价很高(不推荐更改主键);更新主键的代价很高,因为将会导致被更新的行移动。因此,对于InnoDB表,我们一般定义主键为不可更新。
  • 二级索引需要两次索引查找(回表);二级索引访问需要两次索引查找,第一次找到主键值,第二次根据主键值找到行数据。

补充:MySQL中,key、primary key、unique key、与index的区别。
详见文章一文搞懂MySQL索引(清晰明了)

非聚簇索引

数据和索引是分开的,B+树叶子节点存放的不是数据表的行记录。
虽然InnoDB和MyISAM存储引擎都默认使用B+树结构存储索引,但是只有InnoDB的主键索引才是聚簇索引,InnoDB中的辅助索引以及MyISAM使用的都是非聚簇索引。每张表最多只能拥有一个聚簇索引。

InnoDB和MyISAM索引实现,索引的数据结构

InnoDB索引实现

InnoDB使用B+树存储数据,除了主键索引为聚簇索引,其他索引均为非聚簇索引。
一个表中只能存在一个聚簇索引(主键索引),但是可以存在多个非聚簇索引。
InnoDB表和索引的数据是在一起的,表数据和索引的文件都放在.ibd文件中。

聚簇索引(主键索引)

B+树叶子节点包含数据表中行记录就是聚簇索引(索引和数据是存放在一块的)
在这里插入图片描述
可以看到叶子节点包含了完整的数据记录,这就是聚簇索引。因为InnoDB的数据文件(.idb)按主键聚集,所以InnoDB必须有主键(MyISAM可以没有),如果没有显示指定主键,则选取首个为唯一且非空的列作为主键索引,如果还没具备,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。
;
主键索引结构分析:

数据保存以key-value的形式保存。
B+树:所有的数据都存放在叶子结点,非叶子结点只保存键值方便查找;
B树:所有的结点都保存数据;
对于MySQL中的InnoDB数据库引擎的主索引,索引即数据,数据即索引。方便范围查找以及顺序查找;同时存在普通索引,帮助查找某些被查找频率较高的字段。如果需要较多索引,推荐使用联合索引,以提高索引的利用效率。

索引的优缺点

参考文章:一文搞懂MySQL索引(清晰明了)

MySQL体系结构:

在这里插入图片描述
自上而下分为四层:
① 网络接入层
② 服务层
③ 存储引擎层
④ 文件系统层

网络接入层

提供了应用程序进入MySQL服务的接口。客户端与服务器建立连接,客户端发送SQL到服务端。

服务层

管理工具和服务

系统管理和控制工具,例如备份恢复、MySQL复制、集群等。

连接池

主要负责连接管理、授权认证、安全等。
主要负责连接管理、授权认证、安全等等。每个客户端连接都对应着服务器上的一个线程。服务器上维护了一个线程池,避免为每个连接都创建销毁一个线程。当客户端连接到MySQL服务器时,服务器对其进行认证。可以通过用户名与密码认证,也可以通过SSL证书进行认证。登录认证后,服务器还会验证客户端是否有执行某个查询的操作权限。

SQL接口
查询解析器
查询优化器
缓存(8.0以前支持查询缓存,8.0之后就不支持了)

存储引擎层

索引是占用物理空间的,在不同的的存储引擎中,索引存在的文件也不同。存储引擎是给予表的,以下是分别使用MyISAM和InnoDB分别建立的两张表。


当存储引擎是MyISAM时:

  • *.frm:与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等
  • *.MYD:MyISAM DATA,用于存储MyISAM表的数据
  • *.MYI:MyISAM INDEX,用于存储MyISAM表的索引信息
    当是InnoDB时,

文件系统层

*.frm:与表相关的元数据信息都存放在frm文件,包括表结构的定义信息等

  • *.ibd:InnoDB DATA,表数据和索引的文件。该表的索引(B+树)的每个非叶子节点存储索引,叶子节点存储索引和索引对应的数据

参考文章:10分钟了解MySQL体系构架、存储引擎和索引结构

更多推荐

Polygon L2扩容方案揭秘

1.引言前序博客:Polygon生态以太坊扩容是一个几乎与以太坊本身一样古老的问题。扩容任务的复杂性是以太坊伟大之处的直接结果:以太坊是有活力的协议,其缓慢进化,以确保链的安全性和去中心化。当活动的增加刺激了更大的需求时,使用以太坊可能会变得昂贵得令人望而却步。但以太坊扩容意味着什么?本文将解答:何为Layer2(L2

鸿鹄工程项目管理系统em Spring Cloud+Spring Boot+前后端分离构建工程项目管理系统

Java版工程项目管理系统SpringCloud+SpringBoot+Mybatis+Vue+ElementUI+前后端分离功能清单如下:首页工作台:待办工作、消息通知、预警信息,点击可进入相应的列表项目进度图表:选择(总体或单个)项目显示1、项目进度图表2、项目信息施工地图:1、展示当前角色权限下能看到的施工地图(

黑马JVM总结(十四)

(1)分代回收_1Java虚拟机都是结合前面几种算法,让他们协同工作,具体实现是虚拟机里面一个叫做分代的垃圾回收机制,把我们堆内存大的区域划分为两块新生代、老年代新生代有划分为伊甸园、幸存区Form、幸存区To为什么要这样区域划分呢?因为java中有的对象需要长时间使用,长时间使用的对象呢我就把放到老年代当中,哪些用完

python进程和线程(05)

python进程和线程(05)文章目录python进程和线程(05)1python进程和线程1.1进程和线程概念1.2并行执行1.3核心使用语法_threading模块1.4多线程编程1.4.1案例单线程不能满足情况如下:1.4.2多线程1.4.2.1多线程创建语句1.4.2.2案例1.4.2多线程传参使用1.4.2.

物联网网关:连接设备与云端的桥梁

物联网网关作为连接设备与云端的桥梁,承担着采集数据、设备远程控制、协议转换、数据传输等重要任务。物联网网关是一种网络设备,它可以连接多个物联网设备,实现设备之间的数据传输和通信。物联网网关通常具有较高的网络带宽和处理能力,能够满足大量设备同时进行数据传输的需求。物联网网关需要具备以下特点:设备连接与管理:能够与各种物联

Thinger.io 支持多协议、插件化开源 IoT 物联网平台

Thinger.io是一个开源插件化物联网平台,提供了设备原型、扩展和设备连接管理所需的一切工具。我们的目标是使物联网的使用民主化,使其可供全世界使用,并简化大型物联网项目的开发。01Thinger.io功能特性Thinger.io物联网平台由前端Web控制台和后端物联网服务组成,功能架构如下图:连接设备:兼容Linu

Android:获取MAC < 安卓系统11 <= 获取UUID

1.核心代码主要的UseMac.javaimportandroid.annotation.SuppressLint;importandroid.content.Context;importandroid.net.ConnectivityManager;importandroid.net.NetworkInfo;impo

【PickerView案例08-国旗搭建界面加载数据 Objective-C预言】

一、来看我们第三个案例1.来看我们第三个关于PickerView的一个案例,首先呢,我要问大家一下,咱们这个是几组数据呢,这是一个pickerView,只不过,它显示的是什么,一个界面,前面两个案例,都是文字这个案例,开始有图片了,总结一下这三个案例:1)第一个案例:组与组之间,没有任何关系,2)第二个案例:组与组之间

Java学习day03:方法、break和continue关键字

声明:该专栏本人重新过一遍java知识点时候的笔记汇总,主要是每天的知识点+题解,算是让自己巩固复习,也希望能给初学的朋友们一点帮助,大佬们不喜勿喷(抱拳了老铁!)Java学习day03:方法、break和continue关键字一、方法1.什么是方法程序中最小的执行单元2.为什么要有方法开发中出现大量重复代码或功能,循

油猴Safari浏览器辅助插件:Tampermonkey for Mac中文版

油猴脚本Tampermonkey是一款油猴Safari浏览器辅助插件,是一款适用于Safari用户的脚本管理,能够方便管理不同的脚本。虽然有些受支持的浏览器拥有原生的用户脚本支持,但tampermonkey油猴插件将在您的用户脚本管理方面提供更多的便利,它可以提供了诸如便捷脚本安装、自动更新检查、标签中的脚本运行状况速

公众环境关注如何提升企业ESG表现(2011-2022年)

参照陶云清(2023)的做法,本团队对来自“科学学与科学技术管理”《公众环境关注如何提升企业ESG表现?—基于外部压力与内部关注的双重视角》一文中的基准回归部分进行复刻。如何驱动企业在逐利过程中兼顾环境、社会和治理表现(ESG)成为高质量发展过程中不可回避的重大现实问题。基于此,利用2011-2022年A股上市公司ES

热文推荐