InnoDB中索引的实现

news2025/1/18 13:56:17

B+树索引的使用

5.6.1 不同应用中B+树索引的使用

在OLTP应用中,查询操作只从数据库中取得一小部分数据,一般可能都在10条记录以下,甚至在很多时候只取1条记录,如根据主键值来取得用户信息,根据订单号取得订单的详细信息,这都是典型OLTP应用的查询语句。在这种情况下,B+树索引建立后,对该索引的使用应该只是通过该索引取得表中少部分的数据。这时建立B+树索引才是有意义的。

OLAP应用需要分析特定的场景来进行创建。

5.6.2 联合索引

从本质上来说,联合索引也是一棵B+树,不同的是联合索引的键值的数量不是1,而是大于等于2。

我们可以看到,多个键值的B+树是按照(a,b)组合排序,这样的方式对于:

select * from table where a=xxx and b=xxx 和select * from table where a=xxx是可以走索引的,但是对于select * from table where b=xxx是不能走索引的。

5.6.3 覆盖索引

InnoDB存储引擎支持覆盖索引(covering index,或称索引覆盖),即从辅助索引中就可以得到查询的记录,而不需要查询聚集索引中的记录。使用覆盖索引的一个好处是辅助索引不包含整行记录的所有信息,故其大小要远小于聚集索引,因此可以减少大量的IO操作。

5.6.4 优化器选择不使用索引的情况

当执行EXPLAIN命令进行SQL语句的分析时,会发现优化器并没有选择索引去查找数据,而是通过扫描聚集索引,也就是直接进行全表的扫描来得到数据。这种情况多发生于范围查找、JOIN 链接操作等情况下。

现象:

使用select * from order where orderid > 10000;这条语句不会走 orderid 辅助索引,而是会走聚集索引,因为查询的是*,代表所有字段。如果要求访问的数据量很小,则优化器还是会选择辅助索引,但是当访问的数据占整个表中数据的蛮大一部分时(一般是20%左右),优化器会选择通过聚集索引来查找数据。

如果需要强制走某个索引,那么需要用到 force index :

select * from order FORCE INDEX(OrderID) where orderid > 10000;

5.6.5 索引提示

MySQL数据库支持索引提示(INDEX HINT),显式地告诉优化器使用哪个索引。

个人总结以下两种情况可能需要用到INDEX HINT:

  1. MySQL数据库的优化器错误地选择了某个索引,导致SQL语句运行的很慢。这种情况在最新的MySQL数据库版本中非常非常的少见。优化器在绝大部分情况下工作得都非常有效和正确。这时有经验的DBA或开发人员可以强制优化器使用某个索引,以此来提高SQL运行的速度。
  2. 某SQL语句可以选择的索引非常多,这时优化器选择执行计划时间的开销可能会大于SQL语句本身。例如,优化器分析Range查询本身就是比较耗时的操作。这时DBA或开发人员分析最优的索引选择,通过IndexHint来强制使优化器不进行各个执行路径的成本分析,直接选择指定的索引来完成查询。

MySQL中HINT的用法:

select * from t USE INDEX(a) WHERE a=1 AND b=2;

USE INDEX只是告诉优化器可以选择该索引,实际上优化器还是会再根据自己的判断进行选择。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/428059.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux下最小化安装CentOS-7.6(保姆级)

文章目录安装包开始安装一、 新建一个虚拟机二、配置安装CentOS7.6二、开始安装CentOS三、配置CentOS并下载基本信息安装包 链接:https://pan.baidu.com/s/1DodB-kDy1yiNQ7B5IxwYyg 提取码:p19i 开始安装 一、 新建一个虚拟机 1、 打开VMWare&#x…

UVCCamera 源码解析

本文将通过UVCCamera源码研究 概述相机传感器数据采集至USB数据传输整个过程 下载源码配置调试环境 git clone GitHub - saki4510t/UVCCamera: library and sample to access to UVC web camera on non-rooted Android device 注释调原有 ndk-build编译方式 //tasks.with…

使用 /permissive- 编译器开关时变量名or被识别为关键字

使用 /permissive- 编译器开关时变量名被识别为关键字 VS2022已经默认开启对c14的支持。并且,一般同时开启的还有/permissive-开关。项目属性如下所示: 然而,在许多早期代码中,函数名和变量名使用了c14等新标准中的关键字&#…

德国访问学者申请签证事宜

德国访问学者长期签证所需材料,下面就随知识人网小编一起看一看。 1、护照及复印件两份。 2、申请表附加表两份(里面有好多注意事项,最重要的是用德文填写,当时我就谷歌翻译后写上去的,最后附加表上的地点,有好多人问填办大使馆还…

谷歌seo快速排名优化方法,谷歌seo需要哪些技术手段?

谷歌seo快速排名优化方法怎么做? 答案是:利用GLB推广技术可以实现谷歌快速排名。 具体请阅读:什么叫GLB外推? 你只想快速曝光你的企业品牌,GLB外推技术是一个不错的选择。 但如果你想优化自己的外贸官网&#xff0…

【springcloud】服务熔断——Hystrix

官方资料:Home Netflix/Hystrix Wiki GitHub 服务雪崩 多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的“扇出”,如果扇出的链路上某个微服务的调用响…

配置python的opencv环境

1、核心 opencv与numpy包的版本必须适配。核心包版本: numpy1.15.0 opencv4.1.0 2、创建opencv环境 (1)创建一个opencv的虚拟环境 conda create -n cv_python python3.6.0(2)激活虚拟环境 activate cv_python (3)安装numpy的1.15.0版本 pip install numpy1.1…

windows自定时间显示格式(将星期几调出来)

一般的情况下是不是显示星期几的 添加红色方框中的内容

ctfshow 愚人杯菜狗杯部分题目(flasksession伪造ssti)

目录 <1>愚人杯 (1) easy_signin (2) easy_ssti(无过滤ssti) (3) easy_flask(flash-session伪造) (4) easy_php(C:开头序列化数据) <2> 菜狗杯 (1) 抽老婆(flask_session伪造) (2) 一言既出&#xff0c;驷马难追(intval) (3) 传说之下&#xff08;js控制台&…

0101quick_find_union-union_find-动态连通性-算法研究

文章目录1 前言2 动态连通性3 算法3.1 算法设计3.1 union-find算法API3.2 数据结构和通用实现3.3 quick-find算法3.3.1 思想和实现3.3.2 分析3.4 quick-union算法3.4.1 算法描述3.4.2 算法实现3.4.3 性能分析结语1 前言 为了说明我们设计和分析算法的基本方法&#xff0c;我们…

通过SSD对齐功能轻松将 HDD 克隆到 SSD

由于 SSD 的优越性能&#xff0c;越来越多的用户正在考虑将他们的操作系统从 HDD 转移到 SSD。然而&#xff0c;一些用户反馈&#xff0c;在迁移之后&#xff0c;SSD 的启动速度并未提升。 为什么将操作系统从 HDD &#xff08;机械硬盘&#xff09;迁移到 SSD&#xff08;固态…

【leetcode hot 100】【7】11. 盛最多水的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 示…

JUC-多线程(11.面试问题简析)学习笔记

文章目录1. synchronized 关键字底层原理以及其与 lock 的区别2. 对CAS的理解以及底层实现原理3. ConcurrentHashMap实现线程安全的底层原理是什么4.对JDK中的AQS了解吗&#xff1f;AQS的实现原理是什么&#xff1f;5. 线程池的核心配置参数是干什么的&#xff1f;应该怎么用&a…

电子表格软件与一站式BI的区别

看完本节内容&#xff0c;相信您能够了解到电子表格软件&#xff08;代号电子表格软件&#xff09;与「一站式 BI」的主要区别。所谓一站式BI在官网上的名称就是Smartbi V10.5&#xff0c;代号就是Smartbi一直在使用insight。 这两个产品都属于商业智能BI软件的品类&#xff0…

文献阅读:Semantic Communications: Principles and Challenges

传统通信和语义通信的对比 语义信道容量&#xff08;从公式角度解释为什么语义通信的信道容量可以高于传统通信的信道容量&#xff09; 离散无记忆信道的语义信道容量表示为&#xff1a; Cssup⁡p(Z∣X){I(X;V)−H(Z∣X)HS(V)‾}C_s\sup _{p(Z \mid X)}\left\{I(X ; V)-H(Z \m…

再识华为云数据库——GaussDB

目录 一、GaussDB: 立足创新与自研&#xff0c;助力企业核心数据安全高效上云 二、GaussDB: 基于华为openGauss开放生态打造的 金融级分布式数据库 三、GaussDB(for MySQL): 基于开源生态打造的企业级自研云原生数据库 四、DRSUGO&#xff1a;数据库结构应用数据一站式迁移…

Vue学习——【第四弹】

前言 上一篇文章 Vue学习——【第三弹】 中我们了解了MVVM模型&#xff0c;这篇文章接着学习Vue中的数据代理。 简单介绍 数据代理就是**一个对象(A)来代理对另一个对象(B)的属性操作(A一定要包含B)。**直接看定义大家可能觉得有些抽象&#xff0c;我们可以用代码来实现。 …

网络编程

网络编程 1.1、概述 计算机网络&#xff1a; 计算机网络是指将地理位置不同的具有独立功能的多台计算机及其外部设备&#xff0c;通过通信线路连接起来&#xff0c;在网络操作系统&#xff0c;网络管理软件及网络通信协议的管理和协调下&#xff0c;实现资源共享和信息传递的计…

第十一节 java中的线程类

java中常见类&#xff1a;字符串类 集合类 异常类 前面讲完了 程序&#xff1a;是含有指令和数据的文件&#xff0c; 被存储在磁盘或其他的数据存储 设备中&#xff0c;也就是说程序是静态的 代码。.c .java文件都放在外存里 获得资源获得CPU执行 这叫进程 程序和进程的…

【学习积累】Queue 与 ConcurrentQueue性能测试

在 C# 中&#xff0c;关于队列&#xff08;Queue&#xff09;有两种&#xff0c;一种就是我们普通使用的队列&#xff0c;另一种是线程安全的队列 ConcurrentQueue<T> 。 ConcurrentQueue表示线程安全的先进先出 (FIFO) 集合。https://learn.microsoft.com/zh-cn/dotnet…