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

【示例】MySQL-不同case下索引的使用分析

前言

本文主要讲述不同SQL语句下,索引的生效情况。

关于索引的前置知识,本文不再讲述。

SQL语句性能分析方法

查看不同类型SQL语句的执行频率

SHOW GLOBAL STATUS LIKE 'COM_______';

慢查询日志

该日志记录了SQL执行时间超过指定参数的所有SQL语句。

# 若要开启慢查询日志,需要在.cnf配置文件中设置
slow_query_log = 1# 设置记录时间为2s,执行时间超过2s的SQL语句将会被记录
long_query_time = 2

若是在Linux系统中,慢查询日志的位置:/var/lib/mysql/localhost-slow.log


profile变量

通过profile可以让我们知道每条SQL的执行时间都消耗在什么地方

# 查看是否支持profile
SELECT @@have_profiling;# 开启profile
SET profiling = 1;# 执行了一些SQL语句......# 查看profile总体:给出query_id、SQL语句、消耗时间
show profiles;# 查看特定SQL语句的CPU耗时情况
show profile cpu for query query_id;

explain

可以获取MySQL如何执行select语句的信息,包括select语句执行过程中表如何连接和连接的顺序。

# 调用方式:直接在常规select语句前边加explain

索引使用 | 常规索引

select * from table_1 where name = xxx;

name有创建常规索引,走常规索引查询

name没有创建索引,不走索引查询,耗时更长

假设查询条件中有and条件:

  • and前后的列都单独创建有索引:在查询的时候,只会选用一个列的索引进行查询。
  • and前后的列创建有联合索引:在查询的时候,走联合索引。

上述示例中,当name字段不是聚簇索引,会产生回表查询。

回表查询指:当使用非聚簇索引查询的时候,若索引的列无法满足查询要求时,会在使用非聚簇索引查询到主键的时候,再走一遍聚簇索引查询需要的数据。

索引使用 | 联合索引

最左前缀原则

在使用联合索引的时候,需要满足最左前缀法则。

最左前缀原则是指:在使用联合索引的时候,按照定义联合索引的时候的列前后关系进行分析

  • 从最左列开始分析
  • 当某一列不在查询条件中,该列及其右边的列的索引将失效
  • 特殊情况:若最左列不在查询条件中,则联合索引全部失效

在创建联合索引的时候(假设参与列从左到右依次为:A、B、C),相当于创建了以下这些索引:

  • 列A的单列索引
  • 列A和列B的联合索引
  • 列A和列B和列C的联合索引

所以有了最左前缀原则的出现。

# 假定:profession、age、status三列建立了联合索引# 联合索引全部生效
explain select * from tb_user where profession = '软件工程' and age = 31 and status = '0';# 联合索引生效2个
explain select * from tb_user where profession = '软件工程' and age = 31;# 联合索引生效1个
explain select * from tb_user where profession = '软件工程';
# 联合索引生效1个
explain select * from tb_user where profession = '软件工程' and status = '0';# 联合索引不生效
explain select * from tb_user where age = 31;# 联合索引全部生效
# 最左匹配是指按照定义联合查询时候列的左右来匹配的,在sql语句中的位置不影响,只要都体现就行
explain select * from tb_user where age = 31 and profession = '软件工程' and status = '0';

范围查询

当联合索引的列中,有的列出现了范围查询。

  • 当范围查询中没有等号出现,例如:<、 > : 范围查询的列右边的列索引失效
  • 当范围查询中有等号出现,例如:<=、>= : 右边的列索引仍然生效

【右边的列】:仍然指定义联合索引时候的左右位置,而不是在SQL中where条件书写的先后位置

# 只有profession、age两列的索引生效
explain select * from tb_user where profession = '软件工程' and age > 30 and status = '0';# 当范围查询出现等号,后续列索引仍然有效
# 即业务允许的情况下,尽可能使用类似于>=或<=这样的范围查询语句
explain select * from tb_user where profession = '软件工程' and age >= 30 and status = '0';

索引使用 | 覆盖索引

覆盖索引就是:查询过程使用了索引,并写需要返回的结果列,在该索引中都能找到。

使用覆盖索引,就要减少select *的使用。

# 假定profession、age、status创建了联合索引。# 做到了覆盖索引
# 需要返回的结果在索引中都有:联合索引属于二级索引,叶子节点挂的值就是行数据的主键,在该表中,主键就是id
explain select id, profession from tb_user where profession = '软件工程' and age = 31 and status = '0';# 没做到覆盖索引,需要回表查询,即走聚集索引
# 先走联合索引(二级索引)找到数据的主键(id),然后走聚集索引,找到对应的数据。
explain select * from tb_user where profession = '软件工程' and age = 31 and status = '0';

索引使用 | 前缀索引

如果字段类型是字符串,有的时候该列创建的索引将非常长,浪费时间,影响查询效率。这时候就可以用前缀索引,用前n个字符创建索引。

前缀索引只能用于字符串类型的数据。

create index on table_name(column_name(n));

索引使用 | 指定特定的索引

如果一个列既参与了联合索引的创建,也单独创建了索引。在用该列作为条件查询的时候,选用哪一个索引是由MySQL确定的。

但是可以认为指定MySQL选用哪一个索引。

# 建议选用某个索引,MySQL执行的时候仍然可以选择自己认为最优的索引执行
explain select * from table_name [use index(index_name)] where xxxxxx;# 忽略不使用某个索引
explain select * from table_name [ignore index(index_name)] where xxxxxx;# 强制选用某个索引
explain select * from table_name [force index(index_name)] where xxxxxx;

索引使用 | 索引下推

参考文章:https://javaguide.cn/database/mysql/mysql-index.html#%E6%9C%80%E5%B7%A6%E5%89%8D%E7%BC%80%E5%8C%B9%E9%85%8D%E5%8E%9F%E5%88%99

索引下推是MySQL提供的一种索引优化功能,可以减少回表次数,提高查询效率。

简单来说,索引下推的原理就是:将部分服务层负责的事情,交给存储引擎层来处理。

相关文章:

【示例】MySQL-不同case下索引的使用分析

前言 本文主要讲述不同SQL语句下&#xff0c;索引的生效情况。 关于索引的前置知识&#xff0c;本文不再讲述。 SQL语句性能分析方法 查看不同类型SQL语句的执行频率 SHOW GLOBAL STATUS LIKE COM_______;慢查询日志 该日志记录了SQL执行时间超过指定参数的所有SQL语句。…...

MySQL表空间管理与优化(8/16)

表空间管理和优化 innodb_file_per_table参数&#xff08;此参数在分区表章节中还会出现&#xff09;&#xff1a; 这个参数决定了InnoDB表数据的存储方式。当参数设置为ON时&#xff0c;每个InnoDB表的数据会单独存储在一个以.ibd为后缀的文件中&#xff0c;这有利于管理和回收…...

杂货铺 | Linux虚拟机Ubuntu操作系统下设置共享文件夹(以及找不到hgfs文件夹怎么办)

文章目录 &#x1f4da;步骤一&#xff1a;配置共享文件夹&#x1f4da;步骤二&#xff1a;配置挂载环境&#x1f4da;步骤三&#xff1a;解决权限问题&#x1f4da;步骤四&#xff1a;解决重启失效问题 &#x1f4da;步骤一&#xff1a;配置共享文件夹 建立本地共享文件夹&…...

《HF经理》:二认知误区

一、管理者掌握重要权力&#xff1a; 二、全力来自管理者的职位&#xff1a; 三、管理者必须控制自己的直接下属&#xff1a; 对策&#xff1a;展示自己的品质&#xff0c;能力和影响力 四、管理者必须建立良好的个人关系&#xff1a; 五、管理这必须确保一切运行正常&…...

ELK日志分析系统之Zookeeper

一、Zookeeper简介 ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务&#xff0c;它提供了一项基本服务&#xff1a;分布式锁服务。分布式应用可以基于它实现更高级的服务&#xff0c;实现诸如同步服务、配置维护和集群管理或者命名的服务。 Zookeepe…...

家居网购项目(Ajax验证用户名+上传图片)

文章目录 1.Ajax验证用户名1.程序框架图2.修改MemberServlet3.修改login.jsp4.结果展示 2.Ajax判断验证码是否输入正确1.修改MemberServlet2.修改login.jsp3.结果展示 3.Ajax添加购物车1.程序框架图2.修改CartServlet2.修改index.jsp3.解决问题—未登录直接添加购物车&#xff…...

09 Php学习:超级全局变量

超级全局变量 PHP中预定义了几个超级全局变量&#xff08;superglobals&#xff09; &#xff0c;这意味着它们在一个脚本的全部作用域中都可用。 PHP 超级全局变量列表: $GLOBALS$_SERVER$_REQUEST$_POST$_GET$_FILES$_ENV$_COOKIE$_SESSION $GLOBALS $GLOBALS 是 PHP 中的…...

【Java】SpringBoot快速整合mongoDB

目录 1.什么是mongoDB&#xff1f; 2.Docker安装mongoDB 3.SpringBoot整合mongoDB步骤 4.验证 1.什么是mongoDB&#xff1f; MongoDB是一种非关系型数据库&#xff0c;被广泛用于大型数据存储和分布式系统的构建。MongoDB支持的数据模型比传统的关系型数据库更加灵活&#x…...

UI设计的未来发展

UI 设计的未来发展&#xff0c;实际上是互联网行业未来发展的折射。毕竟&#xff0c;UI 设计始终是互联网行业的一部分&#xff0c;因此在互联网行业未来发展的可能性来看&#xff0c;UI 设计同样会跟随着互联网的部分稳步前进。曾经&#xff0c;在最初的图形化界面出现的时候&…...

推荐系统学习记录——连续的嵌入空间

连续嵌入空间 推荐系统通常会将用户和项目&#xff08;或商品&#xff09;表示为向量或嵌入&#xff08;embeddings&#xff09;&#xff0c;这些向量被映射到一个称为嵌入空间&#xff08;embedding space&#xff09;的数学空间中。在这个空间中&#xff0c;相似的用户或项目…...

【Entity Framework】你要知道EF中功能序列与值转换

【Entity Framework】你要知道EF中功能序列与值转换 文章目录 【Entity Framework】你要知道EF中功能序列与值转换一、序列1.1 基本用法1.2 配置序列设置 二、值转换2.1 配置值转换器2.2 批量配置值转换器2.3 预定义的转换2.4 ValueConverter类2.5 内置转换器 三、应用3.1 简单…...

顶顶通呼叫中心中间件-SIP分机安全(mod_cti基于FreeSWITCH)

介绍 运行在公网的FreeSWITCH服务器&#xff0c;每天都会接收到很多恶意的呼叫请求和注册请求&#xff0c;尝试盗打电话。合理的配置可以防止电话给倒打&#xff0c;但是每天大量的攻击&#xff0c;会让FS产生很多日志&#xff0c;降低FreeSWITCH的处理能力&#xff0c;cti模块…...

CountDownLatch

CountDownLatch 翻译&#xff1a; 倒计时锁存器&#xff0c;&#xff0c;&#xff0c;&#xff0c;count计数&#xff0c;down停止&#xff0c;Latch锁 解释&#xff1a; 允许一个或多个线程等待&#xff0c;直到在其他线程中执行的一组操作完成的同步辅助不懂&#xff1f;…...

Vue3中的组合式API与选项式API:深入理解与比较

一、引言 Vue.js&#xff0c;作为前端开发的热门框架之一&#xff0c;以其轻量级、易上手、灵活性强等特点深受开发者的喜爱。随着Vue3的发布&#xff0c;其引入了全新的组合式API&#xff08;Composition API&#xff09;&#xff0c;这为Vue.js的开发方式带来了新的变革。本…...

接口自动化测试实战之接口概念、项目简介及测试流程问答!

一、前言 这篇文章呢主要是想讲实战方面的内容&#xff0c;本文主要会讲解接口测试中的一些接口概念&#xff0c;流程等方面的问答&#xff0c;同时还会介绍一下即将要进行测试的项目&#xff0c;这里呢我就不多说废话了&#xff0c;直接进入主题吧。 二、接口概念 接口测试&…...

浏览器工作原理与实践--跨站脚本攻击(XSS):为什么Cookie中有HttpOnly属性

通过上篇文章的介绍&#xff0c;我们知道了同源策略可以隔离各个站点之间的DOM交互、页面数据和网络通信&#xff0c;虽然严格的同源策略会带来更多的安全&#xff0c;但是也束缚了Web。这就需要在安全和自由之间找到一个平衡点&#xff0c;所以我们默认页面中可以引用任意第三…...

Ubuntu配置VScode的C++环境

在Ubuntu系统下配置C环境&#xff0c;并运行helloworld 1. 下载VScode 我这里使用的是星火应用商店&#xff0c;在商店里面可以直接下载安装 http://spark-app.store/ 2.创建文件夹 3.启动VScode并打开该文件夹 4.安装以下几个扩展 PS&#xff1a;Clang这个插件别安装&…...

使用Code开发Django_模版和CSS

转到定义 和 查看定义 在使用Django或任何其他库的过程中,我们可能需要检查这些库中的代码。VS Code提供了两个方便的命令,可以直接导航到任何代码中的类和其他对象的定义: 转到定义 在Python开发环境中,我们可以轻松地对函数、类或者其他导入模块中的成员使用“Go to Def…...

Llama 3下月正式发布,继续开源!

4月10日&#xff0c;Techcrunch消息&#xff0c;Meta在本周伦敦举办的一场活动中确定&#xff0c;下个月将正式发布Llama 3并且继续开源。 Meta全球事务总裁Nick Clegg表示&#xff0c;我们希望在下个月&#xff0c;甚至更短的时间内&#xff0c;正式推出新一代基础模型Llama …...

有图片转成PDF文件格式的方法吗?分享图片转成PDF文件的方法

将图片转换为PDF文件是一个相对简单的过程&#xff0c;但也需要一定的步骤和注意事项。下面&#xff0c;我将详细介绍如何将图片转换为PDF文件&#xff0c;包括所需的工具、步骤以及可能遇到的问题和解决方案。 首先&#xff0c;我们需要一个能够将图片转换为PDF文件的工具。市…...

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

系统设计 --- MongoDB亿级数据查询优化策略

系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log&#xff0c;共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题&#xff0c;不能使用ELK只能使用…...

Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务

通过akshare库&#xff0c;获取股票数据&#xff0c;并生成TabPFN这个模型 可以识别、处理的格式&#xff0c;写一个完整的预处理示例&#xff0c;并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务&#xff0c;进行预测并输…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

ArcGIS Pro制作水平横向图例+多级标注

今天介绍下载ArcGIS Pro中如何设置水平横向图例。 之前我们介绍了ArcGIS的横向图例制作&#xff1a;ArcGIS横向、多列图例、顺序重排、符号居中、批量更改图例符号等等&#xff08;ArcGIS出图图例8大技巧&#xff09;&#xff0c;那这次我们看看ArcGIS Pro如何更加快捷的操作。…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)

LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 题目描述解题思路Java代码 题目描述 题目链接&#xff1a;LeetCode 3309. 连接二进制表示可形成的最大数值&#xff08;中等&#xff09; 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...