Mysql 索引特点
承接上文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量也有少了。
相关文章:
Mysql 索引特点
承接上文Mysql Server原理简介聚簇索引、二级索引、联合索引分别具备什么样的特点?聚簇索引数据跟索引放在一起的叫聚簇索引;数据和索引分开存储的叫非聚簇索引;innodb存储引擎,数据和文件都放在ibd文件中,实际的数据是…...
读书笔记-终身学习
前言人需要终身成长,也需要终身学习,以下是记录个人读书学习的笔记总结,希望能给大家一点借鉴,仅供参考。笔记1、《匠人精神》秋山利辉是日本神奈川县横滨市都筑区“秋山木工”的经营者,从事订制家具制作业务。是一家小…...
了解栈Stack一篇文章就够了
什么是栈栈是一种特殊的线性表,只允许一端进行数据的插入和删除,即先进后出原则。类似于弹夹先装进去的子弹后面出,后放入的子弹先出。栈的底层原理栈是一种线性结构,所以既能使用数组实现,也能使用链表实现࿰…...
CNStack 助推龙源电力扛起“双碳”大旗
作者:CNStack 容器平台、龙源电力:张悦超 、党旗 龙源电力容器云项目背景 龙源电力集团是世界第一大风电运营商, 随着国家西部大开发战略推进,龙源电力已经把风力发电场铺设到全国各地,甚至是交通极不便利的偏远地区&…...
ruoyi-vue-plus1(控制台相关的输出日志)(p6spy插件)(jackson全局配置)(StopWatch)
Jackson配置在启动项目时,我们发现日志打印出这样几行字,初始化了jacdson配置,我们去查看一下来源找。我们找到了一个全局序列化配置类,其中重写了BigNumberSerializer.INSTANCE进去查看发现了这里对于部分范围的数字进行了转为为…...
【Mybatis】| 如何创建MyBatis的工具类
目录🌟更多专栏请点击👇一、前言二、实现过程1. 创建一个ThreadLocal对象2. 初始化SqlSessionFactory3. 获取并存储sqlSession对象4. 关闭sqlSession对象三、 总代码🌟更多专栏请点击👇 专栏名字🔥Elasticsearch专栏e…...
【Java】DT怎么写?
几个重要的注解 怎么用mockito写单元测试? package Biz;import Client.FileIOClient; import Req.FileRequest; import Res.FileResponse; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks;…...
xcode14安装swift package设置github账户token
这里写目录标题登录github账户,复制token打开xcode添加github账户选择swift package登录github账户,复制token 登录github点击上面菜单自己的头像,settings->Developer settings->Personal access tokens->Tokens (classic)->Generate new token (classic) Note名…...
css面试题1
一、css 1. 说一下css的盒模型 在HTML中所有元素都可以看成是一个盒子 盒子的组成: 内容content、内边距padding、边框border、外边距margin 盒模型的类型: 标准盒模型 margin border padding content IE盒模型 margin content(border padding) 控制…...
Hive基础
hive基本语法:查看数据库:hive (default)> show databases; -----查看所有数据库hive (default)> desc database test; ----查看数据库结构hive (default)> select current_database(); ---查看当前数据库创建数据库:hive (default)…...
信息收集-
url: https://en.wikipedia.org:443/wiki/hypertext_Transfer_Protocol?id123#HTTP/1.1_response_messages https:协议 en.wikipedia.org:域名 443:端口 wiki/hypertext_Transfer_Protocol:文件路径 id123&…...
【sdx12】sdx12获取Serial Number操作方法及源码分享Serial Number的寄存器地址
通过串口获取 系统启动时,在boot阶段会打印如下信息 Format: Log Type - Time(microsec) - Message - Optional Info Log Type: B - Since Boot(Power On Reset), D - Delta, S - Statistic S - QC_IMAGE_VERSION_STRING=BOOT.XXXX S - IMAGE_VARIANT_STRING=MAATANAZA S - …...
23种设计模式-工厂模式(安卓应用场景介绍)
工厂模式是一种创建型设计模式,它提供了一种创建对象的方式,而无需将具体的对象创建逻辑暴露给客户端。在Java中,工厂模式常常用于创建复杂对象或对象的构造过程涉及到多个步骤的情况。 在Android开发中,工厂模式也经常被使用&am…...
sheng的学习笔记-服务熔断与降级组件Hystrix
在微服务架构中,一个应用往往由多个服务组成,这些服务之间相互依赖,依赖关系错综复杂。例如一个微服务系统中存在 A、B、C、D、E、F 等多个服务,它们的依赖关系如下图。图1:服务依赖关系通常情况下,一个用户…...
简单给WordPress怎么添加自定义字段面板
今天一淘模板(56admin.com)WordPress怎么添加自定义字段面板?下面本篇文章给大家介绍一下WordPress添加自定义字段面板的方法,希望对大家有所帮助! 我们在WordPress中编写文章的时候,经常会用到一些自定义字段,如网页描…...
大数据框架之Hive:第6章 查询
第6章 查询 6.1 基础语法 1)官网地址 https://cwiki.apache.org/confluence/display/Hive/LanguageManualSelect 2)查询语句语法: SELECT [ALL | DISTINCT] select_expr, select_expr, ...FROM table_reference -- 从什么表查[WHE…...
CentOS 8搭建EMQX集群
概览 EMQX (opens new window)是一款大规模可弹性伸缩的云原生分布式物联网 MQTT (opens new window)消息服务器。 EMQ X 设计目标是实现高可靠,并支持承载海量物联网终端的MQTT连接,支持在海量物联网设备间低延时消息路由: 1. 稳定承载大规模的 MQTT 客…...
基于神经网络的自监督学习方法音频分离器(Matlab代码实现)
目录 💥1 概述 📚2 运行结果 🎉3 参考文献 👨💻4 Matlab代码 💥1 概述 神经网络的输入是混合(男性女性)音频的振幅谱。神经网络的输出目标是男性说话者理想的软掩模。损失函数…...
yocto 如何添加python module
yocto 如何添加python module 最近在使用阿里云的图像识别SDK,在ubuntu主机上使用pip install alibabacloud_imagerecog20190930 安装modules以后就可以运行demo程序了,于是打算将SDK移植到嵌入式板子上面,然后在板子上跑一下demo。但是发现…...
[深入理解SSD系列综述 2.1.2] SLC、MLC、TLC、QLC、PLC NAND_固态硬盘闪存颗粒类型
闪存最小物理单位是 Cell, 一个Cell 是一个晶体管。 闪存是通过晶体管储存电子来表示信息的。在晶体管上加入了浮动栅贮存电子。数据是0或1取决于在硅底板上形成的浮动栅中是否有电子。有电子为0,无电子为1. SSD 根据闪存颗粒区分,固态硬盘有SLC、MLC、TLC、QLC、PLC 五种类型…...
构建多智能体系统时如何通过统一网关管理不同模型的调用与鉴权
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 构建多智能体系统时如何通过统一网关管理不同模型的调用与鉴权 在开发集成多个AI智能体的复杂系统时,工程师常常面临一…...
OpenCore Legacy Patcher终极指南:4步让老款Mac免费升级最新macOS系统
OpenCore Legacy Patcher终极指南:4步让老款Mac免费升级最新macOS系统 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 还在为你的老款Mac无法升级…...
Wand-Enhancer:免费解锁WeMod Pro功能的完整解决方案
Wand-Enhancer:免费解锁WeMod Pro功能的完整解决方案 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/gh_mirrors/we/Wand-Enhancer 还在为WeMod专业版的订阅费用而犹豫吗&…...
DS4Windows终极指南:3步让PS4手柄在PC上完美工作
DS4Windows终极指南:3步让PS4手柄在PC上完美工作 【免费下载链接】DS4Windows Like those other ds4tools, but sexier 项目地址: https://gitcode.com/gh_mirrors/ds/DS4Windows 想要在电脑上使用PS4手柄玩游戏,却总是遇到兼容性问题?…...
SELA框架:融合MCTS与LLM的智能AutoML新范式
1. SELA框架:当MCTS的“棋手”思维遇上LLM的“专家”直觉在数据科学项目里,最耗时的往往不是敲代码,而是做决策。面对一个新的表格数据集,从数据清洗、特征工程到模型选型、调参,每一步都像站在一个岔路口,…...
混沌系统预测极限:稀疏观测、数据同化与混沌同步的信息门槛
1. 项目概述:从稀疏观测中预测混沌 在天气预报、湍流模拟乃至金融系统分析中,我们常常面临一个核心难题:如何利用有限、稀疏且带有噪声的观测数据,去准确预测一个高维、非线性的混沌系统未来的演化?这就像试图通过几个…...
83、CAN FD物理层核心差异:更高速率与更灵活的位时序
CAN FD物理层核心差异:更高速率与更灵活的位时序 从一次现场总线崩溃说起 去年在给某新能源车企做BMS(电池管理系统)升级时,遇到一个让我熬夜到凌晨三点的怪问题。传统CAN总线跑500kbps,整车十几个节点通信稳如老狗。客户要求把电池包内部的状态数据(单体电压、温度、S…...
ZygiskFrida:安卓逆向中基于Zygote的零感知Frida注入方案
1. 这不是“又一个 Frida 注入工具”,而是安卓逆向工作流的物理层重构你有没有过这样的经历:在一台已 root 的测试机上调试某个金融类 App,想 hook 它的 SSL Pinning 检查逻辑,结果 Frida Server 启动失败;换用 frida-…...
AI安全实战:生成式AI安全防御的实战技巧
AI安全实战:生成式AI安全防御的实战技巧📝 本章学习目标:本章聚焦实战应用,通过案例帮助读者将理论转化为实践能力。通过本章学习,你将全面掌握"AI安全实战:生成式AI安全防御的实战技巧"这一核心…...
Bittensor:去中心化AI网络的架构、挑战与激励模型优化
1. 项目概述:当AI遇上去中心化,Bittensor在解决什么核心问题?最近几年,AI模型的能力突飞猛进,但一个越来越明显的趋势是,顶尖的AI能力正快速向少数几家科技巨头集中。无论是训练所需的算力、高质量的数据集…...
