InnoDB索引

InnoDB 下常见索引 B+ 树索引 全文索引 哈希索引 B+ 树索引就是传统意义上的索引,这是目前关系型数据库系统中查找最为常用和最为有效的索引。 B+ 树索引可以分成聚集索引和辅助索引,这两个索引不同的是叶子节点存放的是否是一整行的信息。 聚集索引就是按照每张表的主键构造一课 B+ 树,同时叶子节点中存放的即为整张表的行记录数据,也将聚集索引的叶子节点称为数据页。每个数据页都通过一个双向链表来进行链接。 ... 阅读详情

其数据文件本身就是索引文件。
相比myISAM,索引文件和数据文件是分离的,表数据文件本身就是按B+Tree组织的一个索引结构,树的叶节点data域保存了完整的数据记录。
这个索引的key就是数据表的主键,
因此innoDB表数据文件本身就是主索引,被成为聚蔟索引,也叫聚集索引。
其余的索引都为辅助索引,
辅助索引data域存储相应记录主键的值而不是地址。
在根据主索引搜索时,直接找到key所在的节点即可取出数据,
根据辅助索引查找时,需要先取出主键的值,再走一遍主索引,
设计表时,不建议使用过长的字段作为主键,
也不建议使用非单调的字段作为主键,这样会造成主索引频繁分裂。


通过 explain 命令打印sql语句的执行计划,判断是否命中索引,
type:all 表示全表扫描
key:表示使用的索引,就是主键
extra:using filesort 需要额外的步骤来发现如何对返回的行排序
using temporary 需要创建一个临时表来存储结果,说明查询需要优化

参数说明
id : 表示SQL执行的顺序的标识,SQL从大到小的执行

select_type:表示查询中每个select子句的类型

table:显示这一行的数据是关于哪张表的,有时不是真实的表名字

type:表示MySQL在表中找到所需行的方式,又称“访问类型”。常用的类型有:ALL, index, range, ref, eq_ref, const, system, NULL(从左到右,性能从差到好)

possible_keys:指出MySQL能使用哪个索引在表中找到记录,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用

Key:key列显示MySQL实际决定使用的键(索引),如果没有选择索引,键是NULL。

key_len:表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度(key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的)

ref:表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值

rows:表示MySQL根据表统计信息及索引选用情况,估算的找到所需的记录所需要读取的行数,理论上行数越少,查询性能越好

Extra:该列包含MySQL解决查询的详细信息

EXPLAIN的特性

EXPLAIN不会告诉你关于触发器、存储过程的信息或用户自定义函数对查询的影响情况

EXPLAIN不考虑各种Cache

EXPLAIN不能显示MySQL在执行查询时所作的优化工作

部分统计信息是估算的,并非精确值

EXPALIN只能解释SELECT操作,其他操作要重写为SELECT后查看执行计划。

当全表扫描,或者索引字段数据重复率太高,将不会使用索引


  • 最左前缀原则
    查询的适合查询条件精确匹配索引的左边连续一列或几列,则此列就可以被用到

  • 避免使用where 子句对字段是假函数,to_date() 等。会造成无法命中索引。

  • 使用与业务无关的自增主键作为主键,即使用逻辑主键,不要使用业务主键

  • 避免冗余索引

  • 索引列为not null, 避免全表扫描

  • 删除不必要的、长期未使用的索引

  • 联表查询使用索引提高性能

  • group by 和order by 中只设计一个表中的列,才有可能使用索引来优化

  • 查询条件的字段应使用正确的数据类型,否则mysql会自动做数据类型转换。导致无法命中索引。


慢查询优化基本步骤

先运行看看是否真的很慢,注意设置SQL_NO_CACHE

where条件单表查,锁定最小返回记录表。这句话的意思是把查询语句的where都应用到表中返回的记录数最小的表开始查起,单表每个字段分别查询,看哪个字段的区分度最高

explain查看执行计划,是否与1预期一致(从锁定记录较少的表开始查询)

order by limit 形式的sql语句让排序的表优先查

了解业务方使用场景

加索引时参照建索引的几大原则

观察结果,不符合预期继续从0分析


https://mp.weixin.qq.com/s?__biz=MzI0MjQxNjAyOQ==&mid=2247485299&idx=4&sn=d1e575cdc39de5e842a7d9882d0d150b&chksm=e97de781de0a6e979ce76d49d3fa38d37539cadc70cfdd8762d31c0c51d7da0defd5a30148db&scene=0&xtrack=1#rd

使用IDF和VSCode构建ESP32的开发环境 本文主要介绍构建使用IDF和VS-CODE 工具构建ESP32的开发环境的详细步骤,还应用IDF和VS CODE创建ESP32的项目文件,并实现编译和下载功能。 阅读详情

相关推荐

从SRIOV到SIOV:PCIe虚拟化技术下一代革命

如果说SR-IOV是过去十年PCIe虚拟化的“标杆方案”,那SIOV就是为超大规模云数据中心、AI集群量身打造的“破局者”——它解决了SR-IOV难以逾越的扩展性瓶颈,同时平衡了性能、成本与生态兼容性。今天就从“为什么需要SIOV”到“SIOV到底强在哪”,再到“未来要解决什么问题”,做一次全方位深度拆解。

存储随笔 2552

Mysql实现Oracle中的listagg()

在Mysql中实现Oracle中的listagg()的功能首先建一个表内容如下:在Oracle中的实现把score这列转行并且用逗号拼接用listagg()实现如下:listagg(score, ',') within group(ORDER BY )而在MySQL下可以使用group_concar()来实现:select `name`,group_concat(score separator '...

zhengjl369的博客 1万+

Sharding Sphere JDBC使用Mybatis的saveBatch无法返回主键的问题

Sharding Sphere JDBC使用Mybatis的saveBatch无法返回主键的问题

HHCS231的博客 1829

mysql listagg函数_oracle行转列,列转行函数的使用(listagg,xmlagg)

一、行转列listagg函数:场景:这里的表数据使用的是oracle默认的scott账户下的emp(员工)表。规范写法 : LISTAGG(字段, 连接符) WITHIN GROUP (ORDER BY 字段)通常情况下,LISTAGG是满足需要的,LISTAGG 返回的是一个varchar2类型的数据,最大字节长度为4000。所以,在实际开发中,我们可能会遇到一个问题,连接长度过长。在这个时候,...

weixin_39692271的博客 6326

DreamerV3实战:如何用世界模型在Minecraft中自动挖钻石(附完整训练流程)

本文详细介绍了如何使用DreamerV3世界模型在Minecraft中训练AI智能体自动完成挖钻石的复杂任务。文章深入分析了该任务对强化学习的挑战,提供了从环境配置、模型训练到结果评估的完整实战流程,并分享了关键的调优技巧与问题解决方案,展示了基于模型的强化学习在解决稀疏奖励问题上的强大能力。

weixin_29050271的博客 189

向量乘法器设计

同样基于Wallace树乘法器,我们来构造向量乘法器。 在一些矩阵运算中经常用到向量的相乘运算,本例以4维向量为例子介绍向量乘法器的verilog HDL设计。 设向量a = (a1, a2, a3, a4), b = (b1, b2, b3, b4)。 则a 与 b的点乘为:a * b = a1 b1 + a2 b2 + a3 b3 + a4 b4, 即向量对应位置的值相乘,再相加...

Reborn Lee 2967

mysql( 8.3.0) LISTAGG

LISTAGG在oracle 中经常使用在 MySQL 中,虽然没有名为LISTAGG的内置函数,但可以通过 GROUP_CONCAT函数实现类似的功能——将多行数据按分组合并为单个字符串。

嗨,来了,累了把,歇息一下,暂时放下一切的纷纷扰扰,享受一份自己独处的时光 1039

SLAM算法的优缺点

SLAM(Simultaneous Localization and Mapping,同时定位与地图构建)算法是一种通过传感器数据实时估计机器人自身位置和构建环境地图的技术。

selenia8860的博客 2905

listagg在 mysql 中用 group_concat 实现

请注意,你需要确保你的数据库管理系统支持。这在MySQL中是可以实现的。进行分组并连接成一个字符串。

weixin_53962171的博客 1248

Abaqus6.14.4 Linux详细图文安装教程

Abaqus6.14.4 Linux详细图文安装教程 20170409 1. 准备安装环境 1.1 安装CentOS 6.5,更新库 1.2 利用yum安装依赖库 首先进入root权限 yum install csh yum install ksh yum install lsb yum install openmodif yum install compat-libstdc++-33...

snuhxm的博客 7841

智能车图像处理20-进阶篇12--正入十字补线1

这篇文章主要讲述基本的正入十字补线方法。

taiyuezyh的博客 6930

MySQL 怎么实现listagg

如何在MySQL中实现类似于Listagg的功能 在MySQL中,我们常常需要将多行数据合并为一行,类似于Oracle中的Listagg函数的功能。但是MySQL并没有提供一个直接的Listagg函数,所以我们需要通过其他方式来实现这个功能。 使用GROUP_CONCAT函数 在MySQL中,我们可以使用GROUP_CON...

weixin_36956384的博客 665

RK3576 调试ov2735 mipi-csi摄像头

摘要:本文记录了基于RK3576平台调试OV2735 MIPI摄像头的全过程。开发环境采用Linux 6.1内核和Buildroot文件系统。调试步骤包括:1)硬件检查(电源、晶振和引脚连接);2)驱动配置(设备树节点、ISP通道设置);3)驱动验证(通过ID检测和I2C工具测试);4)推流测试(使用v4l2和gstreamer工具)。重点解决了复位引脚配置、时钟命名匹配等关键问题,并通过寄存器检查确保初始化正常。最终实现了摄像头数据流的成功输出,为嵌入式视觉应用开发提供了完整参考方案。

qq_45147279的博客 1060

浅析InnoDB索引结构

0、导读InnoDB表的索引有哪些特性,以及索引组织结构是怎样的1、InnoDB聚集索引特点我们知道,InnoDB引擎的聚集索引组织表,必然会有一个聚集索引。行数据(ro...

老叶茶馆 1万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

InnoDB 索引

数据库的索引其实就是为了提高数据查询的效率,就像书的目录一样。 1.索引的常见模型 索引实现比较常见的数据结构有哈希表、有序数组和搜索树三种。 哈希表在做添加的时候,速度会非常快;但缺点是,因为不是有序的,所以哈希表做区间查询的时候速度会非常慢。所以哈希表只适用于等值查询的场景。 有序数组在等值查询和范围查询场景中的性能都非常优秀。但是,在需要更新数据的时候,比如往中间插入一条记录就必须挪动后面所有的记录,成本很高。所以,有序数组索引适用于一般不需要再修改数据的情况。 平衡二叉树的搜索效率非常高,

Martin的博客 2714

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

InnoDB中的索引类型

InnoDB数据引擎使用B+树构造索引结构,其中的索引类型依据参与检索的字段不同可以分为主索引和非主索引;依据B+树叶子节点上真实数据的组织情况又可以分为聚族索引和非聚族索引。每一个索引B+树结构都会有一个独立的存储区域来存放,并且在需要进行检索时将这个结构加载到内存区域。真实情况是InnoDB引擎会加载索引B+树结构到内存的Buffer Pool区域。 聚簇索引(聚集索引) 聚簇索引指的是这样的数据组织结构:索引B+树的每个叶子节点直接对应了真实的Data Page。并且B+树所有的叶子节点在最底层共同描

Jay的博客 3456

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

剖析Mysql的InnoDB索引

本篇介绍下Mysql的InnoDB索引相关知识,从各种树到索引原理到存储的细节。 InnoDB是Mysql的默认存储引擎(Mysql5.5.5之前是MyISAM,文档)。本着高效学习的目的,本篇以介绍InnoDB为主,少量涉及MyISAM作为对比。

voidccc的专栏 1万+

innodb索引

1 innodb的索引 可以把索引理解成一本书的目录,通过目录可以快速找到数据的页, 之后在页中查询到具体的数据,速度远远比从一本书的开始到结尾一页一页查询更快。 innodb索引分为2种: 聚簇索引: 所有记录都是通过主键大小排序的双向数据页, 底层数据页存储的是真实的数据记录, 通过主键查询的话, 只需要通过此聚簇索引就可以找到真实的数据记录; 二级索引: 通过索引列大小排序组成的双向数据...

weixin_44655181的博客 391

MySql Innodb 索引有哪些与详解

对于MYSQL的INNODB存储引擎的索引,大家是不陌生的,都能想到是 B+树结构,可以加速SQL查询。但对于B+树索引,它到底“长”得什么样子,它具体如何由一个个字节构成的,这些的基础知识鲜有人深究。本篇文章从MYSQL行记录开始说起,层层递进,包括数据页,B+树聚簇索引,B+树二级索引,最后在文章末尾给出MYSQL索引的建议。表空间首先,我们来了解一下 MySQL 的表空间。

2301_76166241的博客 1031

mysql的InnoDB索引总结

MySQL InnoDB索引核心知识摘要 索引类型与结构 InnoDB索引主要分为聚簇索引和二级索引。聚簇索引按照主键顺序物理存储数据行,每个表仅有一个;二级索引存储索引列+主键值,查询时需"回表"。复合索引遵循最左前缀原则,列顺序影响查询效率。特殊索引包括覆盖索引(避免回表)、前缀索引(节省空间)和全文索引(文本搜索)。 B+树的优势 MySQL选择B+树因其:1)树高度低,减少I/O(3-4层可存百万数据);2)叶子节点链表支持高效范围查询;3)节点大小匹配磁盘页(4-16KB);4

bthdnj的博客 716

InnoDB索引总结

InnoDB索引

肃林的博客 398

InnoDB索引底层原理

先用二分法在最上层的“存储目录项页”中定位该主键值在哪个“目录项页”中,确定在哪个“目录项页”中时,再去对应的中间层的“目录项页”中,继续用二分法进行查询,直到确定出该主键值在最末层的哪个记录页中,在该记录页中依旧通过二分法对页目录(槽)进行定位,直至确定在哪一组中,最后在组中依次对比主键值即可。也讲这些页成为B+树的节点。上面说过,每创建一个索引,就会创建出一棵对应的B+树,二级索引也是,与聚簇索引的区别就是,列值不再是主键,,所以通过二级索引的B+树查询的话,最终需要一个“回表”的操作。

weixin_35856285的博客 1638

InnoDB的哈希索引

InnoDB支持哈希索引吗? 对于InnoDB的哈希索引,确切的应该这么说: (1)使用InnoDB存储引擎的用户无法手动创建哈希索引,这一层上说,InnoDB确实不支持哈希索引; (2)InnoDB会自调优(self-tuning),如果判定建立自适应哈希索引(Adaptive Hash Index, AHI),能够提升查询效率,InnoDB自己会建立哈希索引,这一层上说,InnoDB又是...

E_N_T_J的博客 1724

mysql InnoDB引擎支持hash索引吗

mysql InnoDB引擎支持hash索引吗     查一下mysql官方文档:https://dev.mysql.com/doc/refman/5.7/en/create-index.html, 从上面的图中可以得知,mysql 是支持hash索引的,但支持和不支持又和具体的存储引擎有关系。从图中, 看到InnoDB是支持Btree索引,这是我们众所周知的。 我

nobody 3万+
上一篇: [log]brew install mongodb
下一篇: Java高并发
go_sparrow
博客等级 码龄11年 25粉丝 257原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值