首页 > 数据库 >Mysql索引结构与失效场景

Mysql索引结构与失效场景

时间:2024-03-22 15:25:23浏览次数:41  
标签:非聚 节点 叶子 索引 字段 Mysql 失效 主键

注:Mysql排序实例:https://www.cs.usfca.edu/~galles/visualization/Algorithms.html

1、B树与B+树之间的区别


B树:
1)一个节点有多个元素(元素个数与degree深度有关)
2)当前节点的所有左边节点都是比它小的,右边节点都是比它大的
3)整棵树都是已经排序的,包括节点内部的


B+树:
1)一个节点有多个元素
2)叶子节点是按顺序排放的
3)叶子节点之间直接有双向指针相连
4)叶子节点包括所有数据,非叶子节点数据属于冗余数据

2、Innodb中的B+树是怎么产生的?
1)取数据的最小单位:页(page) 16KB

2)页的结构

3)新增数据默认存放是按主键排序
4)索引类似于目录(章、节),一个节点最大存储数据是一页(16K)。

3、深度为3的B+树最大可以存多少条数据

注:其中14是每条数据所在空间大小(和数据类型有关)

4、Innodb 是如何走索引的
先按主键生成主键索引,按主键顺序生产B+树,其中叶子节点存放的是数据值,属于聚簇索引;
然后其他自建索引结构类似,只不过这些索引的叶子节点存档的是数据记录的主键信息,属于非聚簇索引;
故在使用非主键索引查找时,如果需要查找的数据字段不在索引的叶子节点中时,需要根据叶子节点中存放的主键再查一次,即做一次回表查询,得到所要查询的字段;

5、联合索引为什么支持的是最左原则
联合索引是类似将所有字段拼接为整体作为索引,需要先按首字段比对后再比对后面的字段;
需要注意的是where语句后面的条件排序不影响查询,只要求最字段存在即可;

6、范围查找导致索引失效的原因
非聚簇索引查找范围信息时,若查找字段在不在其叶子节点内时,需要再根据叶子节点中的主键信息再做一次回表操作,若查询所得范围占整体大部分时,其比对次数大于直接轮询表次数,所以失效。失效与查找的范围条件有关。

7、覆盖索引的底层原理
查找的字段在非聚簇索引的叶子节点存在(包括主键信息),此时为覆盖索引。

8、索引扫描底层原理
查找的字段在非聚簇索引的叶子节点存在(包括主键信息),即使不加条件,优先也是从非聚簇索引,存放信息少,速率快,不要求最左原则,因为是全部扫描。

9、order by 为什么会导致索引失效
排序字段在非聚簇索引的索引中都出现时,若查询字段在索引字段中,则直接可以返回当前索引数据;若查询字段不在索引字段中,则需要做一次回表操作,这样远不如直接轮询全表的速率,故索引失效。

10、Mysql中数据类型转换注意点
若字符字段与数据字段比较时,Mysql会将非数字字符转化成0,然后再作比较运算。

11、字段查询导致索引失效的场景
若字符字段与数据字段比较时,Mysql会将非数字字符转化成0,然后再作比较运算,但是我们的非聚簇索引存放的是字符串信息,故索引会失效。

参考视频:https://www.bilibili.com/video/BV1Ys4y1J7iY/

标签:非聚,节点,叶子,索引,字段,Mysql,失效,主键
From: https://www.cnblogs.com/showger/p/18089537

相关文章

  • 【包远程安装运行】SpringBoot+Mysql实现的共享厨房平台+演示视频+开发文档(论文模板)
    今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的共享厨房平台系统,该系统可以实现线上提前预约,线下使用。利用支付宝沙箱来作为支付方式,使该系统更切合实际的表现出实体店线下共享厨房的流程。该系统分为前台和后台。主要实现了除脚手架功能以外下......
  • 【包远程安装运行】SpringBoot+Mysql实现的美食分享菜谱制作平台+演示视频+开发文档(
    今天发布的是由【猿来入此】的优秀学员独立做的一个基于springboot脚手架的美食分享菜谱制作平台系统,该系统分为前台和后台,多用户分享平台。主要实现了除脚手架功能以外下面是系统的功能:前台普通用户:注册、登录、首页、美食家列表、菜谱列表、社区论坛、资讯列表、个人中......
  • 利用influxdb实现空间索引
    问题描述influxdb官方有一个库(实验版本),说的是可以支持空间索引(如查询某一个框内的轨迹点)。但是我经常测试,查询慢的不可思议。我在论坛曾经反馈过这个问题,目前没找到答案。解决方案1、在influxdb表中增加s2_cell_id字段,通过telegraf给该字段赋值。(见上截图)来验证下s2_c......
  • mysql用视图union多表
    订单表xfc_orderDROPTABLEIFEXISTS`xfc_order`;CREATETABLE`xfc_order`(`order_id`int(11)unsignedNOTNULLAUTO_INCREMENT,`order_code`varchar(32)NOTNULLCOMMENT'订单号',`pay_time`int(11)unsignedNOTNULLCOMMENT'付款时间',......
  • 超高性能数据库 OpenM(ysq)LDB:无缝兼容 MySQL 协议 和多语言 MySQL 客户端
    OpenM(ysq)LDB项目介绍OpenM(ysq)LDB是高性能时序数据库OpenMLDB的全新服务模块,OpenMLDB中“ML”既是MachineLearning的缩写,也可以是MySQL的缩写,通过此模块用户可以直接使用MySQL命令行客户端或多种编程语言的MySQLSDK,从而实现OpenMLDB数据库特有的在线离线特......
  • Mysql索引
    目录一、索引1、索引的概念二、索引的作用1、索引的作用2、索引的副作用三、创建索引的原则依据1、索引创建的原则2、MySQL的优化哪些字段/场景适合创建索引,哪些不适合?①小字段②唯一性强的字段③更新不频繁,但查询率很高的字段④表记录超过300+行⑤主键,外键,唯一......
  • AHI对MySQL性能的影响
    MySQL中出现很多latch锁,而这个很大程度上和MySQL自适应hash索引有关。AHI概述MySQLInnoDB存储引擎的自适应哈希(AdaptiveHashIndex,下简称AHI)功能若用户的访问模式基本都是类似KV操作的点查询(pointselect),则InnoDB存储引擎会自动创建哈希索引。在有了哈希索引后,查询无......
  • mysql for update是锁表还是锁行
    转载至我的博客https://www.infrastack.cn,公众号:架构成长指南在并发一致性控制场景中,我们常常用forupdate悲观锁来进行一致性的保证,但是如果不了解它的机制,就进行使用,很容易出现事故,比如forupdate进行了锁表导致其他请求只能等待,从而拖垮系统,因此了解它的原理是非常必要的......
  • 良心干货,常见的MySQL索引类型枚举!!!
    在MySQL中,索引是一种用于快速查询和检索数据的数据结构。它们类似于书籍的目录,可以帮助数据库系统更快地定位到特定的数据行,而不需要扫描整个数据表。索引可以显著提高查询性能,特别是在处理大量数据时。MySQL支持多种类型的索引,每种索引都有其特定的使用场景和优势。以下是......
  • 【测试开发学习历程】MySQL分组查询与子查询 + MySQL表的联结操作
    目录1 MySQL分组查询与子查询1.1数据分组查询1.2过滤分组1.3分组结果排序1.4select语句中子句的执行顺序1.5子查询2 MySQL表的联结操作2.1关系表2.2表联结2.3笛卡尔积2.4内部联结2.5外联结2.6自联结2.7组合查询1 MySQL分组查询与子查询1.1......