深入浅出mysql索引-上

深入浅出MySQL索引(一)常见的索引模型 深入浅出索引(一)常见的索引模型 文章目录深入浅出索引(一)常见的索引模型一、为什么需要索引?二、常见的索引模型2.1 有序数组2.2 哈希表2.3 二叉搜索树2.4 B-Tree2.5 B+Tree 一、为什么需要索引? MySQL的数据存放在数据表中,数据表会被保存在磁盘上,例如下面我们创建一个数据表,那么在磁盘上就会有一个数据表文件来存放数据 create table users( id ... 阅读详情

 

引言

常见索引的模型

哈希表

有序数组

二叉树

mysql底层的索引模型


引言

在日常工作中我们经常会接触到数据库索引,比如一个SQL执行起来很慢,经过分析后,你可能会说"添加个索引"之类的解决方案,那到底什么是索引呢?

索引:简单来说就像书的目录一样(面试的时候不要这么说),其实索引更是一种提高数据查询效率的数据结构

常见索引的模型

提高读写的数据结构很多,这里有三种比较简单的数据结构,分别是哈希表,有序数组和搜索树

哈希表

哈希表是一种key - value形式的数据结构,哈希表是基于哈希函数建立的一种表

地址index = H(key)

H是哈希函数,通过这个函数快速的定位value(也就是地址index),如果多个key通过计算获取同样的value怎么办?这就是hash冲突,解决冲突的方式有这些

  • 开放寻址法
  • 拉链法

假设,你现在维护着一个身份证信息和姓名的表,需要根据身份证号查找对应的名字,这时 对应的哈希索引的示意图如下所示:

图 1 哈希表示意图 图中,User2 和 User4 根据身份证号算出来的值都是 N,但没关系,后面还跟了一个链 表。假设,这时候你要查 ID_card_n2 对应的名字是什么,处理步骤就是:首先,将 ID_card_n2 通过哈希函数算出 N;然后,按顺序遍历,找到 User2。

需要注意的是,图中四个 ID_card_n 的值并不是递增的,这样做的好处是增加新的 User 时 速度会很快,只需要往后追加。但缺点是,因为不是有序的,所以哈希索引做区间查询的速 度是很慢的。

你可以设想下,如果你现在要找身份证号在 [ID_card_X, ID_card_Y] 这个区间的所有用 户,就必须全部扫描一遍了。

所以,哈希表这种结构适用于只有等值查询的场景,比如 Memcached 及其他一些 NoSQL 引擎。

  • 其他方式

今天说索引,其他的索引模型和hash冲突可自行百度

有序数组

单看查询效率的话有序数组是最好的数据结构,但是对于增删操作都要移动后面的数据,成本太高,所以有序数组更适合静态存储引擎

二叉树

二叉搜索树的特点是:每个节点的左儿子小于父节点,父节点又小于右儿子,而插入的搜索效率非常高,但是由于索引不但存在内存,还要存在磁盘中,以innerDB举例,树高4,N叉树的N是1200,那么数据就是17亿

你可以想象一下一棵 100 万节点的平衡二叉树,树高 20。一次查询可能需要访问 20 个数 据块。在机械硬盘时代,从磁盘随机读一个数据块需要 10 ms 左右的寻址时间。也就是 说,对于一个 100 万行的表,如果使用二叉树来存储,单独访问一个行可能需要 20 个 10 ms 的时间,这个查询可真够慢的。 为了让一个查询尽量少地读磁盘,就必须让查询过程访

mysql底层的索引模型

mysql5.7之后默认的存储引擎是innerDB,innerDB使用的b+树的索引模型,数据只存在叶子节点上

b+tree模型在btree的基础上进行的改进,降低树的高度,增大节点存储数据量,b+tree只需要遍历他的所有叶子节点即可

mysql的索引类型分为主键索引和非主键索引,在innerDB中主键索引成为聚簇索引,非主键索引又叫做二级索引,那么二者有什么区别呢?

  • 如果语句是 select * from table where ID=500,即主键查询方式,则只需要搜索 ID 这棵 B+ 树;
  • 如果语句是 select * from table where k=5,即普通索引查询方式,则需要先搜索 k 索引 树,得到 ID 的值为 500,再到 ID 索引树搜索一次。这个过程称为回表;
  • 也就是说,基于非主键索引的查询需要多扫描一棵索引树。因此,我们在应用中应该尽量使 用主键查询;

 

 

深入浅出mysql索引 假设主键为bigint 8字节,指针长度为6字节,那么目录页的索引长度为14,那么一个目录数据页可以存放 (16*1024)/ 14 = 1170 ,那么三层结构前面两层的目录数据页可以存放的数据为 1170 * 1170,假设最后一层真实用户记录的大小为1K,那么存放真实记录的数据页 一页可以存放 (16*1024)/ 1024 = 16,那么最终的结果为 1170 * 1170 * 16 大约为2000w条数据,实际上真实的应用场景记录大小不会那么大,所以3层的结构就基本上适用大部分的场景了。 阅读详情

相关推荐

深入浅出 MySQL 索引优化:如何创建高效的索引结构

本文深入探讨MySQL索引优化策略,从索引的基本概念入手,分析了B+Tree索引的工作原理,重点解析聚集索引与非聚集索引的区别及“回表”机制。文章提出创建高效索引的通用原则:选择合适列、合理设计复合索引(遵循最左匹配原则)、使用覆盖索引避免回表,同时避免冗余索引和维护成本过高。通过实际案例和EXPLAIN分析工具,指导读者识别慢查询并验证优化效果,强调索引并非越多越好,而应针对核心高频查询精准设计。合理的索引结构能显著提升查询性能,降低I/O开销。

专栏 1200

MySQL索引深入浅出

与其他数据库例如 Oracle 和 SQL Server 等数据库中只有一种存储引擎不同的是,MySQL 有一个被称为“Pluggable Storage Engine Architecture”(可替换存储引擎架构)的特性,也就意味着 MySQL 数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。

追风少年仍在追风~ 764

Windows Server远程桌面断开后,PyWinAuto/按键精灵脚本失效?试试这个‘会话保持’的终极配置

本文深入解析Windows Server远程桌面断开后导致PyWinAuto/按键精灵脚本失效的问题,提供会话保持的终极配置方案。通过转换到控制台会话(console模式)和调整组策略,确保自动化程序在断开连接后持续稳定运行,适用于Windows Server各版本。

weixin_28738165的博客 227

深入浅出MySQL索引

索引(index)是帮助MySQL进行高效数据查找的一种数据结构,在数据库中,除了数据本身之外,还维护着满足特定查找算法的数据结构,这些数据结构通过某种方式指向数据,从而可以通过这些数据结构实现高效的查找,这种数据结构就是索引。

蜡笔小柯南的博客 1110

手把手教你绕过Incapsula reese84防护:从JS反混淆到动态Token生成全流程

本文深入解析了以Incapsula reese84为代表的现代Web客户端挑战防护机制,详细介绍了从JS反混淆、算法逆向到动态Token生成的全流程实战方法。文章系统阐述了如何通过模拟浏览器指纹、移植关键算法或嵌入JS引擎来构建自动化应对策略,并提供了稳健的令牌管理与系统架构设计思路,帮助开发者在合规前提下提升自动化工具的适应性。

jenkins8butler的博客 518

雷电模拟器+Google Play服务配置全指南:从安装到定位问题解决

本文详细介绍了雷电模拟器配置Google Play服务的全流程,包括版本选择、组件安装、定位服务调试及网络问题排查。针对安卓开发者的常见挑战,提供从基础到高级的解决方案,帮助优化测试环境稳定性与定位精度。

weixin_30399821的博客 1230

深入浅出MYSQL索引

深入浅出MYSQL索引 索引(Index)是帮助MySQL高效获取数据的数据结构,索引的目的在于提高查询效率,就像字典和书籍的目录一样,有了目录,可以帮助你快速查找你需要的内容。可以理解为一个排好序的快速查找数据结构。也就是说,除了数据之外,数据库还维持着一些满足特定查找算法的数据结构,用来加速查询。 优点: 提高数据检索效率,降低数据库IO成本 降低数据排序的成本,降低CPU的消耗 缺点: 索引本身就是一个数据结构,保存了主键和索引字段,并指向实体表的记录,所以也需要占用内存 索引大大提高了查询速度

Ding 的博客 490

Gamma变换算法之Matlab&FPGA实现

Gamma映射原理 什么是Gamma曲线 人眼的感光与光强并不是呈线性关系的,而是呈非线性关系(指数型关系,如下图左-曲线。在低照度下,人眼更容易分辨出亮度的变化,随着照度的增加,人眼不易分辨出亮度的变化。而图像传感器与输入光强呈线性关系(如下图左-直线)。从图中可见,当传感器感光在20%左右时,人眼感光响应达到了50%,人眼对低照度的变化更为敏感。从下图右侧可见,Reference Tone为人眼感光50%的亮度,而传感器在感光50%时则相对暗的多(见Select,近似中性灰)。这种将原始图像通过映射操

CrazyBingo的博客 7405

MySQL中深入浅出索引

我们在看书的时候,打算回看某一个桥段的内容时。这是你肯定会是先翻看书的目录,从目录确定这段内容的位置,然后再到确切的页中去寻找。你肯定不会,从书的第一页一页一页的翻找。同样,数据库也是,查找数据也不会从一条记录一条记录的寻找。也肯定是先从像书的目录一样的中确定了,才寻找。而这个像书的目录一样的,在数据库中我们称为索引。我们这篇文章就是对MySQL中的索引进行的总结学习

weixin_52259848的博客 1540

【从零开始入门unity游戏开发之——C#篇37】进程、线程、C# 中实现多线程有多种方案和async/await异步编程

进程、线程、C# 中实现多线程有多种方案和async/await异步编程

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

Burpsuite系列安全渗透--自动扫描生成h5报告

第一章简述 Burpsuite是基于Java的用于web安全的工具,能够进行爬虫、代理、编码、密码爆破等任务,并支持对XSS漏洞、文件包含等漏洞的主动扫描或被动扫描。burpsuite2.0具体分为以下11个模块: Dashboard(仪表盘)——显示任务、实践日志等。 Target(目标)——显示目标目录结构的的一个功能。 Proxy(代理)——拦截HTTP/S的代理服务器,作为一个在浏览器和目标应用程序之间的中间人,允许你拦截,查看,修改在两个方向上的原始数据流。 Intruder(...

魔都虫师的博客 2890

深入浅出MySql索引

索引的作用 提高数据查询效率 索引的常见模型 可以用于提高读写效率的数据结构很多,这里三种常见、也比较简单的数据结构,它们分别是哈希表、有序数组和搜索树 哈希表 键 - 值(key - value) 的形式,哈希思路:把值放在数组里,用一个哈希函数把key换算成一个确定的位置,然后把value放在数组的这个位置。 哈希冲突的处理办法:链表 哈希表适用场景: 只有等值查询的场景,比如 Memcached 及其他一些 NoSQL 引擎。 有序数组 按顺序存储。查询用二分法就可以快速查询,时间复杂度是:O(lo

qq_42239520的博客 1416

矢量网络分析仪校准:原理、方法与系统适配性

矢量网络分析仪(VNA)校准是射频测量的关键环节,通过误差建模(12项误差项)和标准件测量,可将系统不确定度从±5dB降至±0.1dB以下。主流校准方法包括SOLT(适用于同轴系统)和TRL(适用于波导系统),二者在标准件、误差重点及频率上限等方面存在显著差异。随着6G与量子通信的发展,动态实时校准将成为新趋势。工程师需根据传输结构、频率范围及精度需求选择合适方法,确保测量精度。

u014344410的博客 262

MySQL深入浅出之索引

文章目录1. 简介2. 索引的常见模型2.1 哈希表2.2 有序数组2.3 二插搜索树2.4 多叉树(N叉树)3. InnoDB的索引模型3.1 主键索引和普通索引3.2 **基于主键索引和普通索引的查询区别?**3.3 索引维护3.4 字符串类型的身份证号,使用身份证号做主键还是自增做主键呢?3.5 什么场景适合用业务字段直接做主键? 1. 简介 索引的出现是为了提高数据查询的效率, 就像书的目录一样, 给一本书创建目录, 就可以快速找到哪一页或哪一章. 2. 索引的常见模型 索引的出现是为了提高查询效率

406156440的博客 2695

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

《MySQL》深入浅出索引

索引的出现其实就是为了提高数据查询的效率,就像书的目录一样。

PnJgHT的博客 353

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

深入浅出MYSQL查询索引失效

深入检出MYSQL查询索引失效

manitod的博客 1281

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

深入浅出 MySQL 索引

最近在梳理 MySQL 核心知识,刚好梳理到了 MySQL 索引相关的知识,我的文章风格很多都是原理 + 实战的方式带你去了解知识点,所以本篇也是。当然,索引的知识点还是很多的,本篇是对索引的基础知识进行讲解,不涉及索引的底层原理,以及未涉及到如何查看执行计划,将会分成多篇进行讲解,请持续关注~本篇讲解了 MySQL 的索引是什么,优缺点,MySQL 索引分类,以及如何通过脚本创建 MySQL 索引,最后通过演示不同类型的索引如何加速查询。

程序员高级码农的博客 916

RDK X5机器人开发环境搭建:从系统烧录到ROS 2部署的完整指南

在嵌入式机器人开发中,开发环境搭建是项目启动的关键环节。其核心原理在于通过系统镜像烧录、网络通信配置和工具链部署,构建稳定可复现的开发基础。技术价值在于提升开发效率,避免环境问题导致的调试障碍。典型应用场景包括视觉检测、SLAM和ROS 2节点开发。RDK X5作为高算力、低功耗的开发板,原生支持Ubuntu和ROS 2,结合SSH远程连接和VS Code远程开发,能快速搭建机器人开发环境。本文详细介绍了从硬件准备到环境固化的全流程,帮助开发者避开常见坑点。

weixin_34417200的博客 298

深入浅出 MySQL 索引(下)

前言 在上一篇文章中,作者介绍了 InnoDB 索引的数据结构模型,今天继续聊聊跟 MySQL 索引有关的概念。 在开始文章之前,我们先来看一个问题: 在下面这个 表 T 中,如果我执行 select * from T where k between 3 and 5,需要执行几次树的搜索操作,会扫描多少行? 下面是这个表的初始化语句。 create table T( ID in...

成长是一辈子的事 783

深入浅出,一文吃透mysql索引

索引是什么 索引是为了提高数据查询效率的数据结构,类似于书的目录一样,可以根据目录而快速找到相关内容。 MySQL 8.0 版本中,InnoDB 存储引擎支持的索引有 B+ 树索引、全文索引、R 树索引,其中,B+ 树索引使用最为广泛。 B+树索引 每一个索引在 InnoDB 里面对应一棵 B+ 树。B+树索引的特点 :基于磁盘的平衡树,树非常矮,一般为 3~4 层,所以访问效率非常高,从千万或上亿数据里查询一条数据,只用 3、4 次 I/O。 假设我们有如下表,ID是主键,字段 k 上有索引..

m0_67073490的博客 647

MYSQL的索引——深入浅出索引(下)

参考文章:https://time.geekbang.org/column/article/69236 目录 覆盖索引 最左前缀原则 索引下推 回到主键索引树搜索的过程,我们称为回表。那么,有没有可能经过索引优化,避免回表过程呢? create table T ( ID int primary key, k int NOT NULL DEFAULT 0, s varchar(16)...

qq_38151401的博客 428

深入浅出 MySQL 索引底层原理

吊打面试官之深入浅出 MySQL 索引底层原理 1、前置知识 在了解 MySQL 索引的底层原理之前,我们需要知道 MySQL 中数据页的相关知识,知道各个数据页可以组成一个双向链表,而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表,每个数据页都会为存储在它里边的记录生成一个页目录,在通过主键查找某条记录的时候可以在页目录中使用二分法快速定位到对应的槽,然后再遍历该槽对应分组中的记录即可快速找到指定的记录。页和记录的关系示意图如下: 页a、页b、页c … 页n可以不在物理结构上相连,只要通

qq_46153765的博客 242
上一篇: Spring Cloud 新一代网关:Spring Cloud GateWay
下一篇: 国产微服务网关-Soul(真香)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值