Mysql 索引特点

news2025/4/9 10:40:54

承接上文Mysql Server原理简介

聚簇索引、二级索引、联合索引分别具备什么样的特点?

聚簇索引

数据跟索引放在一起的叫聚簇索引;

数据和索引分开存储的叫非聚簇索引;

innodb存储引擎,数据和文件都放在ibd文件中,实际的数据是跟索引绑定在一起的,如果表中有主键,那么跟主键绑定,如果没有主键那么跟唯一键绑定,如果没有唯一键,和6个字节的rowid(6字节的随机字符串)进行绑定。

6字节的rowid是隐藏的,看不到的,实际的mysql数据行中包含了非常多的隐藏字段。

MyISAM是非聚簇索引,因为数据文件和索引文件是分开存放的。

innodb中有聚簇索引也有非聚簇索引。

一个表可以有N个索引,每一个索引都是一颗B+树,每个B+树都是独立的,一个表中会存在多颗B+tree。

表中的数据存储几份?

叶子节点存储的数据行存了一份。

如果存一份的话,就会存在一个问题,因为一个表里面会包含N多个B+ tree:

数据只存储一份,其他的非聚簇索引的叶子节点中存储的是聚簇索引的key值,

所以innobdb中也包含了非聚簇索引。

这是一个表数据,id是主键索引,name是普通索引,

id主键索引,叶子节点存储的是数据,所以id是聚簇索引;

name是普通索引,叶子节点存储的是id值,所以name B+ tree是一个非聚簇索引、二级索引或叫辅助索引。

索引是一个具体的物理结构;

如果表中唯一键有多个,没有主键,那么此时聚簇索引按照唯一键的前后顺序创建。

多个列建的索引叫联合索引或复合索引

一般情况下,设置索引列的时候,只会选择一个列作为索引字段,但是在某些特殊情况下,需要将多个列共同组成一个索引字段,称之为联合索引。

MyISAM索引都是辅助索引,没有聚簇索引,都是用来辅助查询的。

在索引优化的时候需要注意什么问题?

  • 索引字段要尽可能小的占用存储空间

  • 在满足业务系统的需求内尽可能自增

  • 索引字段尽可能不要为null,因为很多情况下null并不等于空

  • 选择索引的时候,索引的基数尽可能大,到底给哪些列建立索引,DV/count >= 80%适合创建索引,distinct value唯一值除以count,不重复的值要尽可能多

  • 不要给所有字段添加索引,并不是索引越多越好

什么情况下会导致索引失效?

  • 索引字段尽量不要频繁修改

  • like查询的时候左边不要加%

  • 索引字段不要添加任何表达式操作

  • 索引字段在使用的时候不要出现类型的隐式转换

  • 索引上不要出现函数计算

  • 组合索引在进行使用的时候要遵循最左匹配原则

  • in或or在很多情况下会导致索引失效,但是要根据实际的情况来进行判断

  • 在使用索引的时候,如果中间的某个索引列使用了范围查询,会导致后续的索引失效

回表

select * from table where name='zhangsan',

id是主键,name是普通索引, 先根据name值去name B+树找到对应的叶子节点,取出id值,再根据id值去id B+树中查找全部的结果,这个过程称为回表,回表的效率比较低,尽可能不要使用,避免回表的产生,因为需要回到原来的表里查询对应的数据记录。

索引覆盖

先根据name值去name B+树查找结果,能够直接获得id和name,不需要去id的B+树查找数据了,这个过程叫索引覆盖即索引的叶子节点中包含了要查询的全部数据,推荐使用索引覆盖。

最左匹配原则

id是主键,name、age是组合索引,在查找的时候必须从左往右匹配。第一和第三个sql符合该原则;

如果把age和name的顺序换下,不会影响最终的查询结果,因为这时候优化器会优化,调整对应的顺序,所以也会匹配该原则;在比较数据的时候,先比较第一个,再比较第二个,因为只有第一个相同了,才有比较第二个的可能。

索引下推

select * from table where name=? and age=?,没有索引下推前,先根据name的值从存储引擎中拿到符合条件的数据,然后在server中对age进行数据过滤,有了索引下推之后,直接根据name和age从存储引擎中筛选对应的数据,返回给server,不需要做索引过滤;原来在server层需要对age做过滤,现在下推到了存储引擎层过滤数据。

mysql 5.7之后默认开启索引下推,两个字段一起筛选,筛选的数据量少了,io量也有少了。

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

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

相关文章

在教学中常被问到的几个vue3.x与typescript的问题,统一解答

在教学当中,学生在学习vue3.x时,常常会问到typescript和vue3.x之间的关系,感觉这两个技术总是绑在一起的,下面老赵来统一解答一下: 那学vue3.x,为什么要求也要掌握typescript Vue 3.x是一个使用TypeScript编…

「ML 实践篇」机器学习项目落地

文章目录1. 项目分析1. 框架问题2. 性能指标2. 获取数据1. 准备工作区2. 下载数据3. 查看数据4. 创建测试集3. 数据探索1. 地理位置可视化2. 寻找相关性3. 组合属性4. 数据准备1. 数据清理2. Scikit-Learn 的设计3. 处理文本、分类属性4. 自定义转换器5. 特征缩放6. 流水线5. 选…

Linux入门介绍及Linux文件与目录结构

前言 本文小新为大家带来 Linux 入门介绍及Linux 文件与目录结构 相关知识,具体内容包括Linux入门介绍(包括:Linux概述,Linux与Windows区别,CentOS 下载地址),Linux文件与目录结构等进行详尽介绍…

实验7 图像水印

本次实验大部分素材来源于山大王成优老师的讲义以及冈萨雷斯(MATLAB版),仅作个人学习笔记使用,禁止用作商业目的。 文章目录一、实验目的二、实验例题1. 数字图像水印技术2. 可见水印的嵌入3. 不可见脆弱水印4. 不可见鲁棒水印一、…

自指(Self-reference)

文章目录1. 在逻辑、数学和计算方面2. 在生物学中3. 在艺术4. 在语言中5. 在流行文化中6. 在法律中自我参照(Self-reference)是一个涉及指代自己或自己的属性、特征或行为的概念。它可以发生在语言、逻辑、数学、哲学和其他领域。 在自然语言或形式语言…

JVM调优面试题——垃圾回收专题

文章目录1、如何确定一个对象是垃圾?1.1、引用计数法1.2、可达性分析2、对象被判定为不可达对象之后就“死”了吗?3、都有哪些垃圾收集算法?3.1、 标记-清除(Mark-Sweep)3.2、标记-复制(Mark-Copying)3.3、标记-整理(Mark-Compact)3.4、分代收…

车载技术【USB接口】—Android配件协议AOA【AOA连接】

简述 AOA协议是Google公司推出的用于实现Android设备与外围设备之间USB通信的协议。该协议拓展了Android设备USB接口的功能,为基于Android系统的智能设备应用于数据采集和设备控制领域提供了条件。介绍了Android系统下USB通信的两种模式,并给出了USB配件…

Linux操作系统安装——服务控制

个人简介:云计算网络运维专业人员,了解运维知识,掌握TCP/IP协议,每天分享网络运维知识与技能。座右铭:海不辞水,故能成其大;山不辞石,故能成其高。个人主页:小李会科技的…

yocto 如何添加python module

yocto 如何添加python module 最近在使用阿里云的图像识别SDK,在ubuntu主机上使用pip install alibabacloud_imagerecog20190930 安装modules以后就可以运行demo程序了,于是打算将SDK移植到嵌入式板子上面,然后在板子上跑一下demo。但是发现…

AcWing数据结构 - 数据结构在算法比赛中的应用(下)

目录 Trie树 Trie字符串统计 最大异或对 并查集 合并集合 连通块中点的数量 食物链 堆 堆排序 模拟堆 哈希表 模拟散列表 字符串哈希 Trie树 Trie字符串统计 思路: 设 idx索引用于构建树, 结点son[节点位置][节点分支指针],cnt[]记录单…

TypeScript深度剖析: typescript 的数据类型有哪些?

一、是什么 typescript 和 javascript几乎一样,拥有相同的数据类型,另外在javascript基础上提供了更加实用的类型供开发使用 在开发阶段,可以为明确的变量定义为某种类型,这样typescript就能在编译阶段进行类型检查,…

06-Oracle表空间与用户管理

本讲主要内容: 1.表空间管理:表空间的作用,创建,修改,删除及管理; 2.用户管理:创建用户,修改用户,删除用户,修改密码,解锁; 3.用户…

【LeetCode】13. 罗马数字转整数

题目链接:https://leetcode.cn/problems/roman-to-integer/ 📕题目要求: 罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。 例如, 罗马数字 2 写做 II ,即…

微电影广告发展的痛点

微电影广告以不可阻挡之势进入大众生活中,企业利用微电影广告来进行企业形象塑造的例子比比皆是。于是乎,微电影广告在为企业塑造品牌形象方面上取得了可喜的效果,但也不可忽视,在这个发展过程中,微电影广告所面临的问…

ruoyi-vue-plus1(控制台相关的输出日志)(p6spy插件)(jackson全局配置)(StopWatch)

Jackson配置在启动项目时,我们发现日志打印出这样几行字,初始化了jacdson配置,我们去查看一下来源找。我们找到了一个全局序列化配置类,其中重写了BigNumberSerializer.INSTANCE进去查看发现了这里对于部分范围的数字进行了转为为…

JDK动态代理(powernode CD2207 video)(内含教学视频+源代码)

JDK动态代理(powernode CD2207 video)(内含教学视频源代码) 教学视频原代码下载链接地址:https://download.csdn.net/download/weixin_46411355/87545977 目录JDK动态代理(powernode CD2207 video&#xf…

2022CCPC女生赛(补题)(A,C,E,G,H,I)

迟了好久的补题&#xff0c;&#xff0c;现在真想把当时赛时的我拉出来捶一拳排序大致按照题目难度。C. 测量学思路&#xff1a;直接循环遍历判断即可&#xff0c;注意角度要和2π取个最小值。AC Code&#xff1a;#include <bits/stdc.h>typedef long long ll; const int…

Linux设备的I/O模型

背景&#xff1a;进程休眠和唤醒为了把一个进程设置为睡眠状态&#xff0c;需要把这个进程从TASK_RUNNING(可运行状态或就绪态)状态设置为TASK_INTERRUPTIBLE(浅度睡眠)或TASK_NUINTERRUPTIBLE(深度睡眠)状态&#xff0c;并且从进程调度器的运行队列中移走&#xff0c;我们称这…

jUnit的学习笔记

jUnit学习笔记要不要做单元测试的思考jUnit的使用jUnit的一些注意事项注解Assert断言JUnitCoreTestCaseTestResultTestSuite 测试套件忽略测试时间测试异常测试参数化测试jUnit中遇到的问题1.多线程测试时&#xff0c;jUnit自动退出了&#xff1f;2.测试入库的数据时&#xff0…

各种激活函数的计算公式、图像以及实现代码

激活函数已经成为神经网络中非常重要的一部分&#xff0c;随着各种类型的神经网络模型被人们开发出来&#xff0c;各种激活函数也应运而生&#xff0c;在不同的场景中&#xff0c;取得良好的效果。本文跟据著名的YOLO系列目标检测模型的源码 AlexeyAB Darknet&#xff0c;整理出…