MySQL中索引相关知识小结

MySql数据库索引相关知识 mysql主要支持两种类型的索引**B+tree(B+tree是一种多路搜索树,每个节点包含关键字以及指向节点的指针)、hash表(hash表索引则是通过哈希函数将键值映射到数组索引上,从而实现查找)**索引。二级索引被称为非聚集索引或辅助索引,二级索引的叶子节点存储的是主键而不是数据。给表的多个字段创建索引,必须遵循“最左前缀匹配”原则(即对应的sql要命中这个索引,对应的查询条件需要与组合索引的字段顺序保持一致,可以不是完全匹配,但是第一个条件需要与第一个索引字段匹配,不然会无法命中索引)。 阅读详情

索引

索引是什么

MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。我们可以简单理解为:快速查找排好序的一种数据结构。Mysql索引主要有两种结构:B+Tree索引和Hash索引。我们平常所说的索引,如果没有特别指明,一般都是指B树结构组织的索引(B+Tree索引)。

索引分类

主键索引: 数据列不允许重复,不允许为NULL,一个表只能有一个主键。
唯一索引: 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
普通索引: 基本的索引类型,没有唯一性的限制,允许为NULL值。
全文索引:是目前搜索引擎使用的一种关键技术,对文本的内容进行分词、搜索。
覆盖索引:查询列要被所建的索引覆盖,不必读取数据行
组合索引:多列值组成一个索引,用于组合搜索,效率大于索引合并

数据库索引的原理,为什么要用B+树,为什么不用二叉树?

可以从几个维度去看这个问题,查询是否够快,效率是否稳定,存储数据多少,以及查找磁盘次数,为什么不是二叉树,为什么不是平衡二叉树,为什么不是B树,而偏偏是B+树呢?
为什么不是一般二叉树?
如果二叉树特殊化为一个链表,相当于全表扫描。平衡二叉树相比于二叉查找树来说,查找效率更稳定,总体的查找速度也更快。
为什么不是平衡二叉树呢?
我们知道,在内存比在磁盘的数据,查询效率快得多。如果树这种数据结构作为索引,那我们每查找一次数据就需要从磁盘中读取一个节点,也就是我们说的一个磁盘块,但是平衡二叉树可是每个节点只存储一个键值和数据的,如果是B树,可以存储更多的节点数据,树的高度也会降低,因此读取磁盘的次数就降下来啦,查询效率就快啦。
那为什么不是B树而是B+树呢?
1)B+树非叶子节点上是不存储数据的,仅存储键值,而B树节点中不仅存储键值,也会存储数据。innodb中页的默认大小是16KB,如果不存储数据,那么就会存储更多的键值,相应的树的阶数(节点的子节点树)就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的IO次数有会再次减少,数据查询的效率也会更快。
2)B+树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的,链表连着的。那么B+树使得范围查找,排序查找,分组查找以及去重查找变得异常简单。
在B树中,键和值即存放在内部节点又存放在叶子节点;在B+树中,内部节点只存键,叶子节点则同时存放键和值。
B+树的叶子节点有一条链相连,而B树的叶子节点各自独立的。
B+树索引的所有数据均存储在叶子节点,而且数据是按照顺序排列的,链表连着的。那么B+树使得范围查找,排序查找,分组查找以及去重查找变得异常简单。.
B+树非叶子节点上是不存储数据的,仅存储键值,而B树节点中不仅存储键值,也会存储数据。innodb中页的默认大小是16KB,如果不存储数据,那么就会存储更多的键值,相应的树的阶数(节点的子节点树)就会更大,树就会更矮更胖,如此一来我们查找数据进行磁盘的IO次数有会再次减少,数据查询的效率也会更快.

索引优缺点

优点:
1.唯一索引可以保证数据库表中每一行的数据的唯一性
2.索引可以加快数据查询速度,减少查询时间
缺点:
1.创建索引和维护索引要耗费时间
2.索引需要占物理空间,除了数据表占用数据空间之外,每一个索引还要占用一定的物理空间
3.以表中的数据进行增、删、改的时候,索引也要动态的维护。

索引哪些情况会失效

查询条件包含or,可能导致索引失效
如何字段类型是字符串,where时一定用引号括起来,否则索引失效
like通配符可能导致索引失效。
联合索引,查询时的条件列不是联合索引中的第一个列,索引失效。
在索引列上使用mysql的内置函数,索引失效。
对索引列运算(如,+、-、*、/),索引失效。
索引字段上使用(!= 或者 < >,not in)时,可能会导致索引失效。
索引字段上使用is null, is not null,可能导致索引失效。
左连接查询或者右连接查询查询关联的字段编码格式不一样,可能导致索引失效。
mysql估计使用全表扫描要比使用索引快,则不使用索引。

索引不适合哪些场景

数据量少的不适合加索引
更新比较频繁的也不适合加索引
区分度低的字段不适合加索引(如性别)

索引匹配方式

在这里插入图片描述

覆盖索引、回表、索引下推

覆盖索引:查询列要被所建的索引覆盖,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。
回表:二级索引无法直接查询所有列的数据,所以通过二级索引查询到聚簇索引后,再查询到想要的数据,这种通过二级索引查询出来的过程,就叫做回表。
索引下推:mysql有自己的服务,mysql服务要和磁盘发生交互,在5.6版本后,出现了索引下推。索引下推前,先从存储引擎拉取数据,拉取根据某一主键筛选的数据,在通过服务根据其他的索引去筛选。有索引下推后,会直接根据组合索引获取数据,不需要server再筛选。

创建索引的原则

最左前缀匹配原则
频繁作为查询条件的字段才去创建索引
频繁更新的字段不适合创建索引
索引列不能参与计算,不能有函数操作
优先考虑扩展索引,而不是新建索引,避免不必要的索引
在order by或者group by子句中,创建索引需要注意顺序
区分度低的数据列不适合做索引列(如性别)
定义有外键的数据列一定要建立索引。
对于定义为text、image数据类型的列不要建立索引。
删除不再使用或者很少使用的索引

聚簇索引与非聚簇索引的使用

在这里插入图片描述

索引分析

举例:

create table test(a int,b varchar(10),c varchar(10));
create index idx_a_b on test(a,b);

插入几条测试数据
在这里插入图片描述
根据explain分析索引有效性:
在这里插入图片描述
key_len:索引的字段长度*字符编码+int为4固定(utf-8–>3,mb4—>2,latin—>1+标志位或者是否为空判断的字节,允许为空占1。

explain其他的参数进行说明:

table:
这是表的名字。
type:
连接操作的类型。下面是MySQL文档关于ref连接类型的说明:
“对于每一种与另一个表中记录的组合,MySQL将从当前的表读取所有带有匹配索引值的记录。如果连接操作只使用键的最左前缀,或者如果键不是UNIQUE或PRIMARY KEY类型(换句话说,如果连接操作不能根据键值选择出唯一行),则MySQL使用ref连接类型。如果连接操作所用的键只匹配少量的记录,则ref是一种好的连接类型。”
在本例中,由于索引不是UNIQUE类型,ref是我们能够得到的最好连接类型。
如果EXPLAIN显示连接类型是“ALL”,而且你并不想从表里面选择出大多数记录,那么MySQL的操作效率将非常低,因为它要扫描整个表。你可以加入更多的索引来解决这个问题。预知更多信息,请参见MySQL的手册说明。
本例子中是rang,下面是对type值的解释
Type:告诉我们对表所使用的访问方式,主要包含如下集中类型;
◇ all:全表扫描
◇ const:读常量,且最多只会有一条记录匹配,由于是常量,所以实际上只需要读一次;
◇ eq_ref:最多只会有一条匹配结果,一般是通过主键或者唯一键索引来访问;
◇ fulltext:
◇ index:全索引扫描;
◇ index_merge:查询中同时使用两个(或更多)索引,然后对索引结果进行merge 之后再读
取表数据;
◇ index_subquery:子查询中的返回结果字段组合是一个索引(或索引组合),但不是一个
主键或者唯一索引;
◇ rang:索引范围扫描;
◇ ref:Join 语句中被驱动表索引引用查询;
◇ ref_or_null:与ref 的唯一区别就是在使用索引引用查询之外再增加一个空值的查询;
◇ system:系统表,表中只有一行数据;
◇ unique_subquery:子查询中的返回结果字段组合是主键或者唯一约束;
possible_keys:
可能可以利用的索引的名字。这里的索引名字是创建索引时指定的索引昵称;如果索引没有昵称,则默认显示的是索引中第一个列的名字(在本例中,它是“firstname”)。默认索引名字的含义往往不是很明显。  
key:   
它显示了MySQL实际使用的索引的名字。如果它为空(或NULL),则MySQL不使用索引。   
key_len:  
索引中被使用部分的长度,以字节计
ref:
列出是通过常量(const),还是某个表的某个字段(如果是join)来过滤(通过key)
的;
rows:  
MySQL所认为的它在找到正确的结果之前必须扫描的记录数。显然,这里最理想的数字就是1。

MySQL聚集索引与非聚集索引相关总结 一、概述 先来问几个问题 为什么索引会提高检索速度? 为什么不建议使用SELECT * ? 为什么针对区分度低的字段,例如性别,不要建索引? 为什么不建议使用mysql内置函数,而是要放在业务代码中去处理? 为什么明明建了索引,但是SQL执行还是很慢? 为什么有时候测试环境执行SQL正常能用到索引生产环境却不行? 为什么建议用自增ID做主键索引,而不是UUID、雪花算法等? ... 阅读详情

相关推荐

【保姆级教程】不到一元32位芯片 DIY迷你时钟

基于不到一元的CH32V003F4P9芯片制作的迷你多功能时钟。

twen51的博客 1813

深入解析mysql中order by与group by的顺序问题

1.mysql 中order by 与group by的顺序是:select from where groupby orderby注意:group by 比order by先执行,order by不会对group by 内部进行排序,如果group by后只有一条记录,那么order by 将无效。要查出group by中最大的或最小的某一字段使用 max或min函数。例子:select s...

lxw1844912514的博客 8373

centos7部署mysql8.0.35,主从复制,主主集群

centos7 linux部署mysql,主从复制,主主模式

zaixiaqin的博客 1990

数据库索引的创建基本守则

介绍数据库应用开发过程中SQL索引创建的最基本守则, 简单实用。

iihero@优快云 643

Android WIFI体系:深入解析WifiLock与MulticastLock的底层实现与性能优化

本文深入解析Android WIFI体系中WifiLock与MulticastLock的底层实现机制与性能优化策略。WifiLock通过阻止Wi-Fi休眠提升网络性能,尤其WIFI_MODE_FULL_HIGH_PERF模式可显著降低延迟;MulticastLock则控制组播数据接收,但会增加功耗。文章详细探讨了其与wpa_supplicant、HAL层的交互,并提供高性能场景下的优化实践与功耗平衡方案。

php55的博客 1079

一文读懂医疗大模型测评基准

面对市场上浩若星海的大模型,医院管理者如何采购适合自身场景的解决方案?如何选取好的模型作为基础进行课题研究?都是医院需要特别重视的问题。评测基准则benchmark是这些问题的重要解法,国内北京、上海、浙江已然开展了相关的标准化工作。

dz102的博客 1836

mysql(六)多列索引之索引顺序问题

使用索引常见的错误是。

weixin_43994761的博客 2674

11n、11ac、11ax和11be MCS表(全网最全)

1、无线协商速率介绍及计算 2、附11n、11ac、11ax 完整MCS速率表

weixin_41500064的博客 2万+

MySQL中,性别列(男,女)为什么不适合建索引?

实验结果显示,在这种场景下全表扫描比使用索引快约33%。这说明对于低区分度列,索引反而可能降低查询性能。

只讲干货,不扯淡! 1086

汇川AM402、H3U和上位机C#ModebusTcp通讯

目录一、测试任务二、测试环境三、PLC工程1、组态配置2、ip地址、端口号 3、全局变量定义四、C#端Winform程序创建1创建主界面 2、创建子窗口 3、运行生成,界面效果4、Modebus协议说明5、Modebus操作说明六、测试1、寄存器读测试 2、MW1300寄存器的BIT位3、写寄存器测试4、PLC断电或者断网 七、工程下载连接1、PLC作为ModebusTCP端,端口号都是502,PC端上位机软件作为TcpClient去连接多台PLC。PC端读写PLC寄存器。2、PC端在有的PLC断电、断网的

panjinliang066333的博客 2万+

【QGIS】软件下载安装及GIS4WRF插件使用

【QGIS】软件下载安装及GIS4WRF插件使用

WW、forever的博客 1799

mysql 某个字段某个值区分度不大适合做索引吗

MySQL索引选择:区分度与字段值的适用性 在数据库设计和优化过程中,索引的选择是一个关键因素。索引可以显著提高查询性能,但并非所有字段都适合建立索引。本文将探讨MySQL中字段的区分度对索引适用性的影响,并提供代码示例和类图说明。 索引的基本概念 索引是一种数据库结构,用于加快数据检索速度。在MySQL中,索引可以基于一...

weixin_35483528的博客 783

从数字后端角度谈谈occ电路(一)

摘要:本文介绍了芯片测试中OCC(On-Chip Clock Control)电路的设计与应用。随着工艺进步,芯片制造面临Stuck-at、Bridging和Delay等故障类型,需要不同时钟频率进行测试。OCC电路通过Clock Selection、Clock Chopping Control和Clock Gating三个模块,实现ATE时钟与PLL时钟的切换控制,支持慢速时钟检测Stuck-at故障和快速时钟检测Delay故障。文章详细解析了OCC电路结构及各模块功能,包括同步单元、移位寄存器等关键组件

芯冰乐 585

MySQL索引、B+树相关知识总结

在 B+树中,非叶子节点不存储数据,只存储键值,这意味着非叶子节点可以拥有更多的键,从而有更多的分叉。 这导致树的高度更低,进一步降低了查询时磁盘 I/O 的次数,因为每一次从一个节点到另一个节点的跳转都可能涉及到磁盘 I/O 操作。

python全栈 3906

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

mysql索引相关知识点

1、最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。索引是一种数据结构。比如我们在查字典的时候,前面都有检索的拼音和偏旁、笔画等,然后找到对应字典页码,这样然后就打开字典的页数就可以知道我们要搜索的某一个key的全部值的信息了。

qq_74136205的博客 1185

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

MySQL索引分析以及相关面试题

可以在我的个人博客阅读文章,排版会美观一些:文章地址 1. 什么是索引 一种能帮助mysql提高查询效率的数据结构:索引数据结构 索引优点: 大大提高数据查询速度 索引缺点: 维护索引需要耗费数据库资源 索引要占用磁盘空间 当对表的数据进行增删改的时候,因为要维护索引,所以速度收到影响 结合索引的优缺点,得出结论:数据库表并不是索引加的越多越好,而是仅为那些常用的搜索字段建立索引效果才是最佳的! 2. 索引的分类 主键索引:PRIMARY KEY 设定为逐渐后,数据库自动建立索引,i.

兴趣使然的草帽路飞 2万+

【Mysql知识】Mysql索引相关知识详解

MySQL索引知识摘要 索引是数据库中用于加速查询的数据结构,类似于书籍目录。主要作用包括提升查询速度(避免全表扫描)和保证数据唯一性(唯一索引)。常用索引类型有:主键索引(唯一非空)、唯一索引(可空)、普通索引、全文索引和复合索引(多列组合)。索引通过B+树结构实现数据排序和快速定位。 创建原则:优先为高频查询条件、连接字段和排序字段建立索引,选择值区分度高的列(高选择性)。复合索引需遵循最左前缀原则。索引虽然提升查询性能,但会增加存储开销并降低写入速度,因此需要合理使用。可通过ALTER TABLE或C

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1650

MySQL索引相关操作小结

备注:测试数据库版本为MySQL 8.0 这个blog我们来聊聊MySQL 索引相关操作 文章目录一.创建索引1.1 前缀索引1.2 函数索引1.3 唯一索引1.4 全文索引1.5 多值索引1.6 空间索引1.7 索引相关选项1.7.1 KEY_BLOCK_SIZE1.7.2 index_type1.7.3 COMMENT 'string'1.7.4 VISIBLE, INVISIBLE二.删除索引 一.创建索引 语法: CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX

只是甲的博客 725

MySQL索引、B+树相关知识汇总

7、EXPLAIN select * from employees where deptid=“1002” and jobs=“测试” and empname=“张飞” 使用了索引。8、EXPLAIN select * from employees where deptid=“1002” or jobs=“测试” or empname=“张飞” 不使用索引。5、EXPLAIN select * from employees where jobs=“测试” and deptid=“1002”

python全栈 1677

Mysql 索引知识详解

本文目录结构: 引言 一、背景 二、Mysql索引  1.概念说明  2.常见索引模型    哈希表    有序数组    二叉搜索树  3.InnoDB索引模型    索引分类     (1).聚簇索引      主键索引     (2).非聚簇索引      联合索引      前缀索引      普通索引      唯一索引      全文索引     (3).索引原理      聚簇索引      非聚簇索引    索引维护    覆盖索引    应用场景 三、总结  

Python+大数据+数据分析+自动化+Vue组件开发 3339

Mysql数据库(四)——mysql索引相关知识

Mysql数据库(三)——mysql索引相关知识一、索引的概念二、索引的优缺点1、优点2、缺点三、创建索引的原则四、索引的分类和创建方法1、普通索引①、直接创建索引②、修改表方式创建③、创建表的时候指定索引2、唯一索引①、直接创建②、修改表方式创建索引③、创建表的时候指定索引3、主键索引①、创建表的时候指定索引②、修改表方式创建索引4、组合索引①、创建表的时候指定组合索引②、修改表方式创建组合索引5、全文索引①、直接创建索引②、修改表方式指定全文索引③、创建表的时候指定全文索引五、查看索引六、删除索引1、直

想成功,靠自己 3292

MySQL索引相关知识整理学习

索引:用于快速查找数据。索引是将数据的一些关键信息通过特定的数据结构存储到一片新的空间中,这样在文件查找的时候能快速找到。MySQl主要有两种类型的索引:哈希索引、B+树索引。

虽千万人,吾往矣 1461

索引相关知识总结

当查询的数据,在索引树中找不到的时候,需要通过非主键索引获取主键,再到主键索引树中去获取所要查询的记录,这个过程叫回表。如:select * from Table where age = 22;通过执行计划(explain)的Extra字段值,可以看到当前sql是否进行了回表,如果Extra字段值为Using index则表示当前查询通过覆盖索引可以获取到,无需通过回表查询记录。select的数据列只用从索引中就能够取得,不必回表,换句话说:查询列要被所建的索引覆盖。最左前缀匹配原则。

先知三日 731

索引相关知识

索引是一种能够提高检索(查询)效率的提前排好序的数据结构。可以理解为一本书的目录,便于快速查找。

hhhhhhasddad的博客 1424

MySQL索引相关知识

深入浅出MySQL索引常见索引模型覆盖索引联合索引 常见索引模型 哈希表是一种以键 - 值(key-value)存储数据的结构,我们只要输入待查找的值即 key,就可以找到其对应的值即 Value。哈希的思路很简单,把值放在数组里,用一个哈希函数把key 换算成一个确定的位置,然后把 value 放在数组的这个位置。不可避免地,多个 key 值经过哈希函数的换算,会出现同一个值的情况。处理这种情况...

weixin_43770941的博客 233
上一篇: Unsafe类学习
下一篇: Spring Boot整合JOOQ(入门学习)
CodersCoder
博客等级 码龄10年 90粉丝 258原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值