当前位置: 首页 > article >正文

一道MySQL索引题


 复合索引基础

MySQL中的复合索引(Composite Index)是指由多个列组成的索引。与单列索引不同、复合索引的结构更为复杂,但使用得当可以大幅提升查询性能。

复合索引的工作原理

复合索引的本质是一种有序的数据结、每个列是建立在那个索引前一列存在的情况下、那一列有序才有意义。这句话是理解复合索引的关键

以复合索引(name,sex,age)为例:

  • 首先MySQL按name字段排序
  • 当name相同时、才按sex排序
  • 当name和sex都相同时、才按age排序

这类似于字典中的词条排序方式:先按第一个字母排序、第一个字母相同时按第二个字母排序、以此类推。

最左前缀原则

由于复合索引的这种层级结构特性、MySQL使用复合索引时必须遵循最左前缀原则

1. 查询必须从索引的最左边列开始
2. 不能跳过索引中的列
3. 如果查询条件有范围查询,则其右边的列无法使用索引优化

题目分析

让我们分析题目中的表结构:

CREATE TABLE `teacher_table` (`id` bigint NOT NULL AUTO_INCREMENT,`name` char(10) DEFAULT NULL,`birth` varchar(20) DEFAULT '',`sex` varchar(10) DEFAULT NULL COMMENT '性别',`age` int DEFAULT NULL,PRIMARY KEY (`id`),KEY `composite_index` (`name`,`sex`,`age`),KEY `index_birth` (`birth`)
) ENGINE=InnoDB ;

这里创建了一个复合索引composite_index  包含name、sex和age三个字段。

分析各选项:

A选项:

SELECT * FROM teacher_table WHERE name = '张三' AND sex = '男' AND age = 20

完全匹配复合索引的三个字段、按顺序使用、可以充分利用索引。

B选项:

SELECT * FROM teacher_table WHERE sex = '男' AND age = 20 AND name = '张三'

虽然WHERE条件的顺序与索引列顺序不同、但MySQL优化器会自动调整、仍然可以使用完整的复合索引。

C选项:

SELECT * FROM teacher_table WHERE sex = '男' AND name = '张三'

包含了name和sex、MySQL优化器会重排顺序、使用复合索引的前两列。

D选项:

SELECT * FROM teacher_table WHERE sex = '男' AND age = 20

没有包含索引的第一列name、违反了最左前缀原则、无法使用复合索引。

E选项:

SELECT * FROM teacher_table WHERE age = 20 AND name = '张三'

包含了第一列name、但跳过了中间的sex列、只能使用name一个列的索引效果。

因此D选项是无法利用复合索引的查询

总结:

D违反了最左匹配原则、导致索引失效

B中优化器会对查询条件进行重排

C包含了 name 和 sex、查询时优化器会先重排条件、然后可以使用 name 和 sex 索引

E则是先重排条件、然后使用 name 索引(因为它是索引的第一列)

算法题

题目要求在每个查询中计算的是一个从 nums[l1] 开始、到 nums[l2]、然后依次减去到 nums[r] 的结果。具体来说每个查询 (l, r) 需要计算类似于:

也就是说给定一个区间 [l, r]、你要从 nums[l] 开始、然后依次减去 nums[l+1], nums[l+2],直到 nums[r]。

nums[l-1] - nums[l] - nums[l+1] - ... - nums[r-1]

差不多就是:

我写的代码超时:

import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int q = sc.nextInt();int[] nums = new int[n];for (int i = 0; i < n; i++) {nums[i] = sc.nextInt();}int result = 0;for (int i = 0; i < q; i++) {int l = sc.nextInt();int r = sc.nextInt();int currentSum = 0;if (l == r) {currentSum = nums[l - 1];} else {int digital = nums[l - 1];int sum = 0;for (int j = l; j < r; j++) {sum += nums[j];}currentSum = digital - sum;}System.out.println(currentSum);}}
}

题目优化思路:

由于每次查询的结果是计算一段区间的加减、且每次都涉及到相邻元素的减法、可以通过 前缀和 的思想来优化。所以我们构造一个辅助数组、在 O(1) 时间内处理每次查询。

优化策略:

  1. 前缀和数组:首先我们可以计算一个前缀和数组、表示数组 nums 中从 nums[0] 到 nums[i] 的和。这个可以在 O(n) 时间内完成。

  2. 计算差值数组:根据题目的要求、构建一个 差值”数组 diff[i] = nums[i] - nums[i+1](即后一个元素减去当前元素)、这样当你需要做连续的减法时、就能快速计算出结果。

  3. 快速查询:每次查询 (l, r)、利用 diff 数组快速得出 nums[l] - nums[l+1] - ... - nums[r] 的结果。

优化后的代码:

import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();  // 数组长度int q = sc.nextInt();  // 查询次数int[] nums = new int[n];// 输入数组元素for (int i = 0; i < n; i++) {nums[i] = sc.nextInt();}// 构建前缀和数组int[] prefixSum = new int[n + 1];  // prefixSum[i] 表示 nums[0] 到 nums[i-1] 的和for (int i = 1; i <= n; i++) {prefixSum[i] = prefixSum[i - 1] + nums[i - 1];}// 处理每个查询for (int i = 0; i < q; i++) {int l = sc.nextInt();  // 查询的起始位置int r = sc.nextInt();  // 查询的结束位置// 计算区间 [l, r] 的和,并按照要求计算结果int sum = prefixSum[r] - prefixSum[l - 1];  // 获取区间和int currentSum = nums[l - 1] - sum;  // nums[l-1] - sumSystem.out.println(currentSum);  // 输出结果}}
}

测试用例:

相关文章:

一道MySQL索引题

复合索引基础 MySQL中的复合索引(Composite Index)是指由多个列组成的索引。与单列索引不同、复合索引的结构更为复杂&#xff0c;但使用得当可以大幅提升查询性能。 复合索引的工作原理 复合索引的本质是一种有序的数据结、每个列是建立在那个索引前一列存在的情况下、那一…...

Python 读取 txt 文件详解 with ... open()

文章目录 1 概述1.1 注意事项1.2 模式说明1.3 文件准备 2 读文件2.1 读取整个文件2.2 逐行读取2.3 读取所有行到列表 3 写文件3.1 覆盖写入3.2 追加写入3.3 写入多行 4 实用技巧4.1 检查文件是否存在4.2 异常处理 1 概述 1.1 注意事项 文件编码&#xff1a;建议指定编码&…...

【linux】设置邮件发送告警功能

当服务器内存不足或者其他故障时&#xff0c;可以通过自动发送故障到邮箱进行提醒。 步骤&#xff1a; 以qq邮箱为例&#xff1a; 登录qq邮箱点击设置 点击账号后&#xff0c;往下翻 找到POP3/IMAP...开启服务 复制授权码 安装邮箱功能 编辑/etc/s-nail.rc 验证 …...

【手机】vivo手机应用声音分离方案

文章目录 前言方案 前言 尝试分离vivo手机音乐与其他应用的声音 方案 最佳方案&#xff1a;网易云音乐设置内关闭音量均衡 上传不同的白噪音&#xff0c;成功 goodlock&#xff0c;主要适用于三星手机&#xff0c;vivo不一定适用 app volume control &#xff0c;可行...

关于Safari浏览器在ios<16.3版本不支持正则表达式零宽断言的解决办法

异常原因 今天在升级Dify版本的时候发现低版本的ios手机出现了以下报错&#xff1a; SyntaxError: Invalid regular expression: invalid group specifier nameError: Invalid regular expression: invalid group specifier name Call Stack 46 eval [native code] (0:0) ./n…...

管理+技术”双轮驱动工业企业能源绿色转型

00序言 在“3060双碳”政策目标下&#xff0c;工业领域作为碳排放的主要来源&#xff08;占比约70%&#xff09;&#xff0c;国家出台《工业领域碳达峰实施方案》《加快推动制造业绿色化发展的指导意见》等文件&#xff0c;明确行业碳达峰时间表和重点任务&#xff0c;完善碳市…...

每天学一个 Linux 命令(30):cut

​​可访问网站查看,视觉品味拉满: http://www.616vip.cn/30/index.html cut 命令用于从文件或输入流中提取文本的特定部分(如列、字符或字节位置)。它常用于处理结构化数据(如 CSV、TSV)或按固定格式分割的文本。以下是详细说明和示例: 命令格式 cut [选项] [文件...]…...

智慧养老综合实训室规划与实施:产教融合的智慧养老实践

智慧养老综合实训室作为智慧养老、智慧康养产业发展的关键支撑&#xff0c;深度融合物联网、大数据、人工智能等前沿技术&#xff0c;搭建虚实结合的教学场景&#xff0c;依托DeepSeek知识库模型实现知识的高效转化与创新&#xff0c;旨在打造产教融合的实践平台&#xff0c;为…...

华为设备命令部分精简分类汇总示例

华为网络设备的命令体系庞大且复杂&#xff0c;不同设备系列&#xff08;如交换机、路由器、防火墙&#xff09;和不同操作系统版本&#xff08;如VRP5、VRP8&#xff09;的命令可能存在差异。以下是一个 精简分类汇总&#xff0c;涵盖常用配置场景和命令示例&#xff1a; 一、…...

JAVA | 聚焦 OutOfMemoryError 异常

个人主页 文章专栏 在正文开始前&#xff0c;我想多说几句&#xff0c;也就是吐苦水吧…最近这段时间一直想写点东西&#xff0c;停下来反思思考一下。 心中万言&#xff0c;真正执笔时又不知先写些什么。通常这个时候&#xff0c;我都会随便写写&#xff0c;文风极像散文&…...

Operating System 实验二 内存管理实验

目录 实验目标: 实验设备: 实验内容: (1)验证FIFO和Stack LRU页面置换算法 【代码(注释率不低于30%)】 【实验过程(截图)】 【结论】 (2)分别用FIFO和Stack LRU页置换算法,自己设定一个页面引用序列,绘制页错误次数和可用页帧总数的曲线并对比(可用Excel绘…...

CF-Hero:自动绕过CDN找真实ip地址

CF-Hero&#xff1a;自动绕过CDN找真实ip地址 CF-Hero 是一个全面的侦察工具&#xff0c;用于发现受 Cloudflare 保护的 Web 应用程序的真实 IP 地址。它通过各种方法执行多源情报收集。目前仅支持Cloudflare的cdn服务查找真实ip&#xff0c;但从原理上来说查找方法都是通用的…...

Linux基础IO(十一)之动态库(基础IO的最后一篇啦!)

文章目录 动态库生成动态库使用动态库现象事实使用外部库动态库怎么被加载的进程地址空间的第二讲关于地址1.程序没有加载前的地址&#xff08;程序&#xff09;2.程序加载后的地址&#xff08;进程&#xff09;3.动态库的地址 动态库 生成动态库 shared: 表示生成共享库格式…...

【版本控制】SVN + TortoiseSVN版本管理实用教程(附安装+开发常用操作)

摘要&#xff1a; 本文将带你从零开始掌握 SVN 版本控制系统&#xff0c;结合 TortoiseSVN 图形客户端工具&#xff0c;深入学习包括安装、检出、提交、更新、回滚、冲突解决等常用开发操作&#xff0c;快速上手团队协作&#xff01; &#x1f9e9; 什么是 SVN&#xff1f; SV…...

非序列实现MEMS聚焦功能

zemax非序列模式下有MEMS,但是没有对应的代码。无法修改成自己需要的功能 以下是实现MEMS聚焦功能: #include <windows.h> #include <cmath> #include <stdio.h> #include <string.h> #include <algorithm> #undef max #undef min#define D…...

【前端】CSS 基础

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解 CSS 基础语法。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! > 专栏选自&#xff1a;前端基础…...

【金仓数据库征文】——选择金仓,选择胜利

目录 第一部分&#xff1a;金仓数据库——开创数据库技术的新时代 1.1 金仓数据库的技术底蕴 1.2 高可用架构与灾备能力 1.3 分布式架构与弹性扩展能力 第二部分&#xff1a;金仓数据库助力行业数字化转型 2.1 电信行业&#xff1a;核心系统国产化替代 2.2 医疗行业&…...

跟着尚硅谷学vue-day5

计算属性和watch监视 一.姓名案例 1.姓名案例-插值语法 <div id"root">姓&#xff1a;<input type"text" value"张" v-model"firstname"><br/><br/>名&#xff1a;<input type"text" value&q…...

【C到Java的深度跃迁:从指针到对象,从过程到生态】第四模块·Java特性专精 —— 第十三章 异常处理:超越C错误码的文明时代

一、错误处理的范式革命 1.1 C错误处理的黑暗时代 C语言通过返回值传递错误状态&#xff0c;存在系统性缺陷&#xff1a; 典型错误处理模式&#xff1a; FILE* open_file(const char* path) { FILE* f fopen(path, "r"); if (!f) { return NULL; // 错误信息…...

运维打铁:Centos 7 使用yum安装 mysql5.7

文章目录 一、安装前信息说明二、安装步骤1. 下载并安装官网 RPM 安装包2. 修改配置文件 /etc/my.cnf3. 创建 MySQL 数据相关目录并授权4. 启动 MySQL 服务 三、修改数据库访问密码1. 修改配置文件 /etc/my.cnf2. 重启 MySQL 服务3. 登录数据库并修改密码4. 恢复配置文件并重启…...

网络原理初始

基础概念 组建局域网方式&#xff1a;路由器或者交换机。 IP确定主机&#xff0c;端口号确定使用的应用程序。 端口号&#xff1a;每个程序在进行网络通信中&#xff0c;都需要一个端口号。 协议&#xff1a;通信过程中的约定。 TCP/IP五层网络协议 从上到下 1、应用层&a…...

基于SpringBoot3实现MyBatis-Plus(SSMP)整合快速入门CURD(增删改查)

目录 一、快速搭建SpringBoot-Web工程脚手架。 1.1 Spring Initializr 初始化工程。(官方提供) 1.2 工程脚手架初始化详细步骤。(IDEA2024.1.1) 二、MyBatis-Plus的特性与快速上手。 2.1 官网地址与基本特性。 2.2 快速上手技术栈基础。 2.3 Spring Boot2 的 MyBatis-Plus Star…...

主题模型三大基石:Unigram、LSA、PLSA详解与对比

&#x1f31f; 主题模型演进图谱 文本建模三阶段&#xff1a; 词袋模型 → 潜在语义 → 概率生成 Unigram → LSA → PLSA → LDA &#x1f4e6; 基础模型&#xff1a;Unigram模型 核心假设 文档中每个词独立生成&#xff08;词袋假设&#xff09; 忽略词语顺序和语义关联 …...

Redis 热 key 和大 key 问题

一、什么是 Redis 热 key&#xff1f; 热 key&#xff08;Hot Key&#xff09;定义&#xff1a; 在单位时间内被**频繁访问&#xff08;读/写&#xff09;**的 key&#xff0c;导致其访问集中、压力过大。 热 key 常见表现&#xff1a; QPS 极高&#xff08;某 key 每秒被访问…...

基准指数选股策略思路

一种基于Python和聚宽平台的量化交易策略&#xff0c;主要包含以下内容&#xff1a; 1. 导入必要的库 - 导入jqdata和jqfactor库用于数据获取和因子计算。 - 导入numpy和pandas库用于数据处理。 2. 初始化函数 - 设置基准指数为沪深300指数。 - 配置交易参数&#xff0c;如使用…...

SAP接口超时:对 FOR ALL ENTRIES IN 的优化

SAP接口超时 经分析要10多分钟以上才出结果&#xff0c;且是这个语句耗时较长&#xff1a; SELECTaufnrmatnrbdmnglgortmeinschargFROM resbINTO CORRESPONDING FIELDS OF TABLE lt_lylcddxhFOR ALL ENTRIES IN lt_lylcddWHERE aufnr IN r_aufnr发现RESB有420万条记录&#xf…...

如何成功防护T级超大流量的DDoS攻击

防护T级超大流量的DDoS攻击需要综合技术、架构与运营策略的多层次防御体系。以下是基于最新技术实践和行业案例总结的关键防护策略&#xff1a; 一、流量清洗与分布式处理 部署流量清洗中心 T级攻击的核心防御依赖于专业的流量清洗技术。通过部署分布式流量清洗集群&#xff0c…...

【Easylive】为什么需要手动转换 feign.Response 到 HttpServletResponse

【Easylive】项目常见问题解答&#xff08;自用&持续更新中…&#xff09; 汇总版 为什么需要手动转换 feign.Response 到 HttpServletResponse&#xff1f; feign.Response 是 Feign 客户端调用远程服务后返回的原始 HTTP 响应对象&#xff0c;而 HttpServletResponse 是…...

深入理解机器学习:人工智能的核心驱动力

在当今数字化时代&#xff0c;机器学习作为人工智能领域的关键技术&#xff0c;正以前所未有的速度改变着我们的生活和工作方式。从智能语音助手到精准的医疗诊断&#xff0c;从个性化的推荐系统到自动驾驶汽车&#xff0c;机器学习的应用无处不在&#xff0c;其影响力深远而广…...

Shell 脚本入门:从零开始写自动化脚本

目录 一、Shell 、Shell 命令、Shell 脚本 二、常用 Shell 命令与注释写法 三、echo 命令的使用 四、Shell 变量类型 五、变量与参数使用 六、读取用户输入 七、算术运算 八、条件判断与流程控制 九、循环结构 十、函数定义与调用 一、Shell 、Shell 命令、Shell 脚本…...