MySQL ② —— 索引原理

1. 索引

1.1 分类

  • 主键索引、唯一索引、普通索引、组合索引、以及全文索引

主键索引

  • 非空唯一索引,一个表只有一个主键索引;
  • 在 innodb 中,主键索引的 B+ 树包含表数据信息。

唯一索引

  • 不可以出现相同的值,可以有 NULL 值。

普通索引

  • 允许出现相同的索引内容。

组合索引

  • 对表上的多个列进行索引

全文索引

  • 将存储在数据库当中的整本书和整篇文章中的任意内容信息查找出来的技术;
  • 关键词 FULLTEXT。

1.2 主键选择

  • innodb 中表是索引组织表,每张表有且仅有一个主键;
  • 如果显示设置 PRIMARY KEY,则该设置的 key 为该表的主键;
  • 如果没有显示设置,则从非空唯一索引中选择;
    • 只有一个非空唯一索引,则选择该索引为主键;
    • 有多个非空唯一索引,则选择声明的第一个为主键;
  • 没有非空唯一索引,则自动生成一个 6 字节的 _rowid 作为主键。

1.3 约束

  • 为了实现数据的完整性,对于 innodb,提供了以下几种约束:primary key,unique key,foreign key,default,not null;
  • 外键约束:
    • 外键用来关联两个表,来保证参照完整性;MyISAM 存储引擎本身并不支持外键,只起到注释作用;而 innodb 完整支持外键, 并具备事务性;
  • 约束与索引的区别:
    • 创建主键索引或者唯一索引的时候同时创建了相应的约束;但是约束是逻辑上的概念;索引是一个数据结构既包含逻辑的概念也包含物理的存储方式;

2. 索引实现

2.1 索引存储

  • innodb 由段、区、页组成:
    • 段分为数据段、索引段、回滚段等;
    • 区大小为 1 MB(一个区由 64 个连续页构成);
    • 页的默认值为 16k;页为逻辑页,磁盘物理页大小一般为 4K 或者 8K;为了保证区中的页的连续,存储引擎一般一次从磁盘中申请4~5个区;
      • 页是 innodb 磁盘管理的最小单位;默认16K,可通过 innodb_page_size 参数来修改;
      • B+ 树的一个节点的大小就是该页的值。
        在这里插入图片描述

2.2 B+树

  • 全称:多路平衡搜索树;
  • 用来组织磁盘数据,以页为单位,物理磁盘页一般为 4K,innodb 默认页大小为 16K;
  • 对页的访问是一次磁盘 IO,缓存中会缓存常访问的页;
  • 特征:非叶子节点只存储索引信息,叶子节点存储具体数据信息;叶子节点之间互相连接,方便范围查询;
  • 每个索引对应着一个 B+ 树;
  • B+ 树的一个节点对应一个数据页;B+ 树的层越高,那么要读取到内存的数据页越多,IO 次数越多。
    在这里插入图片描述

2.3 聚集索引

  • 按照主键构造的 B+ 树;叶子节点中存放数据页;数据也是索引的一部分;
  • 一个索引代表着一个B+树,修改非主键索引就会修改自己的和聚集索引两个B+树,修改一个元素只需要修改聚集索引的B+树

例子1

slelect * from user where id >= 18 and id < 40;

在这里插入图片描述

2.4 辅助索引

  • 叶子节点不包含行记录的全部数据;辅助索引的叶子节点中, 除了用来排序的 key 还包含一个 bookmark ,用来存储聚集索引的 key。

例子 2

select * from user where lockyNum = 33;

在这里插入图片描述

3. innoDB体系结构

  • io速度:顺序内存io(数组)>> 随机内存io(红黑树)≈ 顺序磁盘io >> 随机磁盘io

在这里插入图片描述

  • buffer pool:缓存表和索引数据;采用 LRU 算法(如下图)让 Buffer pool 只缓存比较热的数据。
    在这里插入图片描述
  • change buffer:缓存辅助(二级)索引的数据变更(DML 操作),change buffer 中的数据将会异步 merge 到 buffer pool 中。
  • free list 组织 buffer pool 中未使用的缓存页;flush list 组织 buffer pool 中的脏页,也就是待刷盘的页;lru list 组织 buffer pool 中冷热数据,当 buffer pool 没有空闲页,将从 lru list 中最久未使用的数据进行淘汰。

在这里插入图片描述

4. 最左匹配原则

  • 对于组合索引,从左到右依次匹配,遇到 > < between like 就停止匹配;
  • 对于这样一个组合索引 key `name_cid_idx` ( `name`, `cid` )
    • 会先匹配name,都一样再匹配cid,不会直接就匹配cid
    • 如果查询语句没有name只有cid只会进行全表扫描而不是走辅助索引扫描

5. 覆盖索引

  • 从辅助索引中就能找到数据,而不需通过聚集索引查找;利用 辅助索引树高度一般低于聚集索引树;较少磁盘 IO。

6. 索引下推(面试经常问到)

  • 为了减少回表次数,提升查询效率;在 MySQL 5.6 的版本开始推出;
  • MySQL 架构分为 server 层和存储引擎层;
  • 没有索引下推机制之前,server 层向存储引擎层请求数据,在 server 层根据索引条件判断进行数据过滤;
  • 有索引下推机制之后,将部分索引条件判断下推到存储引擎中过滤数据;最终由存储引擎将数据汇总返回给 server 层。

7. 索引失效

  • select ... where A and B 若 A 和 B 中有一个不包含索引, 则索引失效;
  • 索引字段参与运算,则索引失效;例如:from_unixtime(idx) = ‘2021-04-30’;
  • 索引字段发生隐式转换,则索引失效;例如:将列隐式转换为某个类型,实际等价于在索引列上作用了隐式转换函数;
  • LIKE 模糊查询,通配符 % 开头,则索引失效;例如:select * from user where name like '%Mark';
  • 在索引字段上使用 NOT <> != 索引失效;如果判断 id <> 0 则修改为idx > 0 or idx < 0;
  • 组合索引中,没使用第一列索引,索引失效。

8. 索引原则

  • 查询频次较高且数据量大的表建立索引;索引选择使用频次较高,过滤效果好的列或者组合;
  • 使用短索引;节点包含的信息多,较少磁盘 IO 操作;比如: smallint,tinyint;
  • 对于很长的动态字符串,考虑使用前缀索引;
  • 对于组合索引,考虑最左侧匹配原则和覆盖索引;
  • 尽量选择区分度高的列作为索引;该列的值相同的越少越好;
  • 尽量扩展索引,在现有索引的基础上,添加复合索引;最多 6 个索引
  • 不要 select *; 尽量只列出需要的列字段;方便使用覆盖索引;
  • 索引列,列尽量设置为非空;
  • 可选:开启自适应 hash 索引或者调整 change buffer;
  • mysql遇到字符串和数字比较时,会自动将字符串转换为数字

9. 优化器成本分析

  • MySQL 优化器主要针对 IO 和 CPU 会计算语句的成本;可能不会按照分析的原理来执行语句;
  • 步骤:
    • 找出所有可能需要使用到的索引;
    • 计算全表扫描的代价;
    • 计算不同索引执行查询的代价;
    • 对比找出代价最小的执行方案;

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

git教程

Git 教程 鲁迅曾经说过&#xff1a;“任何事情都有两面性&#xff0c;既有好的一面也会有坏的一面”&#xff0c;就像git&#xff0c;它既简单又复杂&#xff0c;为什么简单呢&#xff1f;因为常用的命令也就那么几个&#xff0c;多使用几次就能轻松掌握。复杂的是它的原理及更…

HarmonyOS 应用开发之UIAbility组件启动模式

UIAbility的启动模式是指UIAbility实例在启动时的不同呈现状态。针对不同的业务场景&#xff0c;系统提供了三种启动模式&#xff1a; singleton&#xff08;单实例模式&#xff09;multiton&#xff08;多实例模式&#xff09;specified&#xff08;指定实例模式&#xff09;…

Prometheus +Grafana +node_exporter可视化监控Linux虚机

1、介绍 待补充 2、架构图 待补充 Prometheus &#xff1a;主要是负责存储、抓取、聚合、查询方面。 node_exporter &#xff1a;主要是负责采集物理机、中间件的信息。 3、搭建过程 配置要求&#xff1a;1台主服务器 n台从服务器 &#xff08;被监控的linux虚机&am…

利用机器学习打造反电信诈骗系统

利用机器学习打造反电信诈骗系统 技术与功能数据集与模型可视化分析与词云结语 随着互联网的普及&#xff0c;电信诈骗日益猖獗&#xff0c;给人们的生活和财产安全带来了巨大的威胁。为了有效应对这一挑战&#xff0c;我们开发了一款基于机器学习的反电信诈骗系统&#xff0c;…

基于单片机音乐喷泉制作设计资料

**单片机设计介绍&#xff0c;基于单片机音乐喷泉制作设计资料 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机音乐喷泉制作设计资料概要主要包括以下几个关键部分&#xff1a;系统概述、硬件设计、软件设计以及实现过…

网络空间测绘系统的商业应用

随着网络空间的不断发展和扩展&#xff0c;网络安全已经成为当今社会面临的重要挑战之一。为了有效应对网络安全威胁&#xff0c;网络空间测绘系统应运而生&#xff0c;成为网络安全领域的重要工具。 网络空间测绘系统不仅能够帮助安全研究人员进行研究和管理&#xff0c;还能为…

IoTeX(IOTX) 推出首个DEPIN数据平台,蓝筹项目合作进入新时代。

首先来了解一下什么是IoTeX(IOTX) 2024年1月25日&#xff0c;作为由IoTeX驱动的首个DEPIN类别优先数据平台&#xff0c;与蓝筹DePIN项目Helium、Akash、Theta、DIMO、Pocket、Drife、WiFi Map和Streamr合作推出。这一官方发布标志着DePIN&#xff08;去中心化物理基础设施网络&…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之九 简单闪烁效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之九 简单闪烁效果 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之九 简单闪烁效果 一、简单介绍 二、简单闪烁效果实现原理 三、简单闪烁效果案例实现简单步骤 四、注意事项 一、简单…

戴尔电脑Dell SupportAssist占用内存高,卸载Dell SupportAssist

咨询戴尔客服了解到&#xff0c;SupportAssist是机器出厂自带的一款应用&#xff0c;主要的功能是可以检查驱动更新以及做一些硬件方面的健康检测&#xff0c;有时候后台运行可能会导致进程占用内存比较大&#xff0c;导致访问被的应用崩溃。 咨询卸载不影响之后&#xff0c;然…

前端学习-CSS基础-Day3

一、CSS三大特性 1.1层叠性 相同选择器给设置相同的样式&#xff0c;此时一个样式就会覆盖&#xff08;层叠&#xff09;另一个冲突的样式。层叠性主要解决样式冲突的问题 层叠性原则&#xff1a; 1.样式冲突&#xff0c;遵循的原则是就近原则&#xff0c;哪个样式离结构近&a…

【MagicDrive环境配置】新手配俩星期版

1.创建一个新的环境conda create -n newdrive python3.8 2.激活该环境conda activate newdrive 3.下载MagicDrive源码 git clone --recursive https://github.com/cure-lab/MagicDrive.git&#xff0c;如果出现时间超时八成是网的问题&#xff0c;直接自己下载解压就好 3.我的…

分类任务中的评估指标:Accuracy、Precision、Recall、F1

概念理解 T P TP TP、 T N TN TN、 F P FP FP、 F N FN FN精度/正确率&#xff08; A c c u r a c y Accuracy Accuracy&#xff09; 二分类查准率 P r e c i s i o n Precision Precision&#xff0c;查全率 R e c a l l Recall Recall 和 F 1 − s c o r e F1-score F1−s…

AI新工具 又一个开源大模型DBRX击败GPT3.5;根据音频和图像输入生成会说话、唱歌的动态视频

✨ 1: AniPortrait 腾讯开源&#xff1a;根据音频和图像输入生成会说话、唱歌的动态视频 AniPortrait 是个先进的框架&#xff0c;专门用来生成高质量的、由音频和参考肖像图片驱动的动画。如果你有视频&#xff0c;也可以用来实现面部的再现&#xff08;Face reenactment&am…

京东云搭建幻兽帕鲁Palworld多人游戏联机服务器教程,1分钟开服

使用京东云服务器搭建幻兽帕鲁Palworld游戏联机服务器教程&#xff0c;非常简单&#xff0c;京东云推出幻兽帕鲁镜像系统&#xff0c;镜像直接选择幻兽帕鲁镜像即可一键自动部署&#xff0c;不需要手动操作&#xff0c;真正的新手0基础部署幻兽帕鲁&#xff0c;阿腾云atengyun.…

Jmeter调用测试片段 —— 模块控制器

可以使用模块控制器调用测试片段。模块控制器提供了一种在运行时将测试片段替换为当前测试计划的机制。测试片段可以位于任何线程组中。 1、打开一个Jmeter窗口&#xff0c;添加好线程组、用户定义变量、模块控制器、测试片段、察看结果树。 2、用户定义变量同样定义好访问ip及…

【二十七】【算法分析与设计】归并(1),912. 排序数组,归并排序,递归函数的时间复杂度计算,LCR 170. 交易逆序对的总数

912. 排序数组 给你一个整数数组 nums&#xff0c;请你将该数组升序排列。 示例 1&#xff1a; 输入&#xff1a;nums [5,2,3,1] 输出&#xff1a;[1,2,3,5] 示例 2&#xff1a; 输入&#xff1a;nums [5,1,1,2,0,0] 输出&#xff1a;[0,0,1,1,2,5] 提示&#xff1a; 1 < …

学习vue3第十二节(组件的使用与类型)

1、组件的作用用途 目的&#xff1a; 提高代码的复用度&#xff0c;和便于维护&#xff0c;通过封装将复杂的功能代码拆分为更小的模块&#xff0c;方便管理&#xff0c; 当我们需要实现相同的功能时&#xff0c;我们只需要复用已经封装好的组件&#xff0c;而不需要重新编写相…

镜视界 | DevSecOps CI/CD 管道中数字供应链安全的集成策略

目录 前言 数字供应链&#xff08;DSC&#xff09;的定义 数字供应链安全的重点内容和风险因素 CI/CD管道的安全目标和可信实体 将数字供应链安全集成到CI/CD管道中 结语 本文字数&#xff1a;7715&#xff0c;阅读时长&#xff1a;19分钟 1.前言 在敏捷开发的模式下&…

Idea2023.3.6版本无法启动设置界面-settings界面打不开无反应---IntelliJ Idea工作笔记013

先说一下网上有,把某个文件删除的 有说是因为汉化问题的 可以看到,其实都不是,这样弄就好了,很简单 Please report thisjava.lang.ClassCastException: class [Lcom.intellij.execution.filters.CompositeInputFilter$InputFilterWrapper; cannot be cast to class java.uti…

AcWing-动态求连续区间和

1264. 动态求连续区间和 - AcWing题库 所需知识&#xff1a;树状数组 树状数组的表现形式&#xff1a;&#xff08;不会画图从别的大佬那里摸过来的&#xff09; 树状数组为分组管理&#xff0c;点与点之间有联系&#xff0c;并非像普通数组一样每个点之间相互独立 树状数组…
最新文章