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.rhkb.cn/news/289374.html

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

相关文章

后端前行Vue之路(一):初识Vue

1.Vue是什么 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方…

Transformer的前世今生 day08(Positional Encoding)

前情提要 Attention的优点&#xff1a;解决了长序列依赖问题&#xff0c;可以并行。Attention的缺点&#xff1a;开销变大了&#xff0c;而且不存在位置关系为了解决Attention中不存在位置关系的缺点&#xff0c;我们通过位置编码的形式加上位置关系 Positional Encoding&…

Flask python 开发篇:上传文件(在指定目录下创建文件夹)

flask上传文件以及常见问题 一、flask文档上传文件的介绍二、上传文件的实现2.1、生成一个from表单&#xff0c;用来提交图片2.2、编写上传的逻辑 三、运行代码、以及常见异常四、写在最后 一、flask文档上传文件的介绍 Flask上传文件的文档介绍&#xff0c;文件上传的基本思想…

面试题--3.18

1. http与https的区别&#xff0c;以及https的认证过程及加密算法 &#xff1f; 区别&#xff1a; https协议需要到CA申请证书&#xff0c;一般免费证书较少&#xff0c;因而需要一定费用。 http是超文本传输协议&#xff0c;信息是明文传输&#xff0c;https则是具有安全性…

重磅发布|博睿数据汽车行业精选案例集!

随着大数据、人工智能等技术的发展&#xff0c;万物互联已成为大势所趋。数字经济作为我国经济增长的新引擎&#xff0c;汽车行业的数字化转型升级也在不断加速。 然而&#xff0c;在传统的IT运维管理模式下&#xff0c;汽车企业在数字化转型过程中面临重重挑战。例如&#xf…

MongoDB内存过高问题分析解决

告警 公司有个3.2.7版本的mongo复制集&#xff0c;最近几天频繁告警内存过高。 服务器配置16C64G内存。mongo备节点内存使用到55G&#xff0c;触发告警。 以下内容基于3.2.7版本&#xff0c;3.2.7版本已经太老&#xff0c;很多后来的命令和配置&#xff0c;3.2.7都没有。 …

MySQL高可用解决方案――从主从复制到InnoDB Cluster架构

2024送书福利正式起航 关注「哪吒编程」&#xff0c;提升Java技能 文末送5本《MySQL高可用解决方案――从主从复制到InnoDB Cluster架构》 大家好&#xff0c;我是哪吒。 爱奇艺每天都为数以亿计的用户提供7x24小时不间断的视频服务。通过爱奇艺的平台&#xff0c;用户可以…

UG NX二次开发(C#)-通过曲线组生成NURBS曲面

文章目录 1、前言2、UG NX中通过曲线组生成NURBS曲面的操作3、采用NXOpen C#方法的源代码1、前言 在UG NX中,曲线、曲面的操作使用比较多,对于创建NURBS曲面,可以通过曲线组来生成,本文以NXOpen C#的方法实现通过曲线组生成NURBS曲面的功能。对于UG NX二次开发感兴趣或者有…

反序列化动态调用 [NPUCTF2020]ReadlezPHP1

在源代码上看到提示 访问一下看看 代码审计一下 <?php #error_reporting(0); class HelloPhp {public $a;public $b;public function __construct(){$this->a "Y-m-d h:i:s";$this->b "date";}public function __destruct(){$a $this->a;…

Cesium.js综合实验

Cesium.js综合实验 1 概述 Cesium是一个跨平台、跨浏览器的展示三维地球和地图的开源 JavaScript 库&#xff0c;是AGI公司计算机图形开发小组与2011年研发的三维地球和地图可视化开源JavaScript库&#xff0c;Cesium一词来源于化学元素铯&#xff0c;铯是制造原子钟的关键元…

华为OD机试 - 考古问题 - 回溯、全排列问题(Java 2024 C卷 200分)

华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&#xff08;A卷B卷C卷&#xff09;》。 刷的越多&#xff0c;抽中的概率越大&#xff0c;每一题都有详细的答题思路、详细的代码注释、样例测试…

如何在Linux系统使用Docker本地部署Halo网站并实现无公网IP远程访问

最近&#xff0c;我发现了一个超级强大的人工智能学习网站。它以通俗易懂的方式呈现复杂的概念&#xff0c;而且内容风趣幽默。我觉得它对大家可能会有所帮助&#xff0c;所以我在此分享。点击这里跳转到网站。 文章目录 1. Docker部署Halo1.1 检查Docker版本如果未安装Docker可…

最小化安装Kubesphere报错问题解决方法

最小化安装Kubesphere报错: TASK [preinstall : Stop if defaultStorageClass was not found] ****************** fatal: [localhost]: FAILED! > {"assertion": "\"(default)\" in default_storage_class_check.stdout", "changed&qu…

【王道训练营】第一题 输出 hello wangdao

文章目录 代码如下所示&#xff1a;C语言基础&#xff1a;理解基本概念和语法结构示例程序代码解析1. #include <stdio.h>2. int main()3. printf("hello wangdao");4. return 0; 更多的例子1. 使用 printf 函数打印多种不同类型的值&#xff1a;2. 使用 scanf…

在Windows系统上安装多个 Nodejs

前言 在Windows系统安装Nodejs 在Windows系统上安装多个 Nodejs v14.16.1安装位置 D:\sde\nodejs\node-v14.16.1-win-x64 v16.20.2安装位置 D:\sde\nodejs\node-v16.20.2-win-x64 v18.20.0安装位置 D:\sde\nodejs\node-v18.20.0-win-x64 v20.12.0安装位置 D:\sde\nod…

提取html工具封装和应用

提取html工具封装和应用 BeautifulSoup库和介绍BeautifulSoup使用BeautifulSoup重点方法BeautifulSoup其他方法 认证参数化实现创建json文件导包&#xff08;参数化&#xff09;编写测试用例技术难点--判断验证码不同 BeautifulSoup库和介绍 BeautifulSoup使用 1、导包 2、实例…

【Vue3之computed属性(四)】

文章目录 前言一、computed属性有缓存二、使用方法三、修改全名 前言 理解computed属性&#xff0c;实现输入姓和名得出全名并双向绑定&#xff0c;区分单向绑定和双向绑定。测试computed属性和方法的区别 一、computed属性有缓存 先引入computed&#xff0c;写箭头函数定义并…

14.黑盒测试

黑盒测试、白盒测试考题固定&#xff0c;重视&#xff01;&#xff01;&#xff01; 等价类、边界值、场景法&#xff1b;考察频率高&#xff01;&#xff01;&#xff01; 因果图&#xff0c;偶尔考&#xff1b;要能看懂因果图&#xff0c;结合题干填写缺失的部分内容&#x…

Jmeter使用BeanShell保存数据到文件

1、目的 在使用jmeter压测时&#xff0c;业务上下连贯&#xff0c;需要对一些编号进行关联操作。这里使用‘JSON提取器’将值提取出来&#xff0c;后面请求可以直接使用。其它业务想要使用就只能把值保存到文件&#xff0c;再使用文件做参数化了。 2、JSON提取器 提取请求值 提…

鸿蒙hdc使用指导

简介 hdc&#xff08;HarmonyOS Device Connector&#xff09;是HarmonyOS为开发人员提供的用于调试的命令行工具&#xff0c;通过该工具可以在windows/linux/mac系统上与真实设备或者模拟器进行交互。 环境准备 hdc工具通过HarmonyOS SDK获取&#xff0c;存放于SDK的toolch…