【示例】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语句下,索引的生效情况。 关于索引的前置知识,本文不再讲述。 SQL语句性能分析方法 查看不同类型SQL语句的执行频率 SHOW GLOBAL STATUS LIKE COM_______;慢查询日志 该日志记录了SQL执行时间超过指定参数的所有SQL语句。…...
MySQL表空间管理与优化(8/16)
表空间管理和优化 innodb_file_per_table参数(此参数在分区表章节中还会出现): 这个参数决定了InnoDB表数据的存储方式。当参数设置为ON时,每个InnoDB表的数据会单独存储在一个以.ibd为后缀的文件中,这有利于管理和回收…...
杂货铺 | Linux虚拟机Ubuntu操作系统下设置共享文件夹(以及找不到hgfs文件夹怎么办)
文章目录 📚步骤一:配置共享文件夹📚步骤二:配置挂载环境📚步骤三:解决权限问题📚步骤四:解决重启失效问题 📚步骤一:配置共享文件夹 建立本地共享文件夹&…...
《HF经理》:二认知误区
一、管理者掌握重要权力: 二、全力来自管理者的职位: 三、管理者必须控制自己的直接下属: 对策:展示自己的品质,能力和影响力 四、管理者必须建立良好的个人关系: 五、管理这必须确保一切运行正常&…...
ELK日志分析系统之Zookeeper
一、Zookeeper简介 ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,它提供了一项基本服务:分布式锁服务。分布式应用可以基于它实现更高级的服务,实现诸如同步服务、配置维护和集群管理或者命名的服务。 Zookeepe…...
家居网购项目(Ajax验证用户名+上传图片)
文章目录 1.Ajax验证用户名1.程序框架图2.修改MemberServlet3.修改login.jsp4.结果展示 2.Ajax判断验证码是否输入正确1.修改MemberServlet2.修改login.jsp3.结果展示 3.Ajax添加购物车1.程序框架图2.修改CartServlet2.修改index.jsp3.解决问题—未登录直接添加购物车ÿ…...
09 Php学习:超级全局变量
超级全局变量 PHP中预定义了几个超级全局变量(superglobals) ,这意味着它们在一个脚本的全部作用域中都可用。 PHP 超级全局变量列表: $GLOBALS$_SERVER$_REQUEST$_POST$_GET$_FILES$_ENV$_COOKIE$_SESSION $GLOBALS $GLOBALS 是 PHP 中的…...
【Java】SpringBoot快速整合mongoDB
目录 1.什么是mongoDB? 2.Docker安装mongoDB 3.SpringBoot整合mongoDB步骤 4.验证 1.什么是mongoDB? MongoDB是一种非关系型数据库,被广泛用于大型数据存储和分布式系统的构建。MongoDB支持的数据模型比传统的关系型数据库更加灵活&#x…...
UI设计的未来发展
UI 设计的未来发展,实际上是互联网行业未来发展的折射。毕竟,UI 设计始终是互联网行业的一部分,因此在互联网行业未来发展的可能性来看,UI 设计同样会跟随着互联网的部分稳步前进。曾经,在最初的图形化界面出现的时候&…...
推荐系统学习记录——连续的嵌入空间
连续嵌入空间 推荐系统通常会将用户和项目(或商品)表示为向量或嵌入(embeddings),这些向量被映射到一个称为嵌入空间(embedding space)的数学空间中。在这个空间中,相似的用户或项目…...
【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服务器,每天都会接收到很多恶意的呼叫请求和注册请求,尝试盗打电话。合理的配置可以防止电话给倒打,但是每天大量的攻击,会让FS产生很多日志,降低FreeSWITCH的处理能力,cti模块…...
CountDownLatch
CountDownLatch 翻译: 倒计时锁存器,,,,count计数,down停止,Latch锁 解释: 允许一个或多个线程等待,直到在其他线程中执行的一组操作完成的同步辅助不懂?…...
Vue3中的组合式API与选项式API:深入理解与比较
一、引言 Vue.js,作为前端开发的热门框架之一,以其轻量级、易上手、灵活性强等特点深受开发者的喜爱。随着Vue3的发布,其引入了全新的组合式API(Composition API),这为Vue.js的开发方式带来了新的变革。本…...
接口自动化测试实战之接口概念、项目简介及测试流程问答!
一、前言 这篇文章呢主要是想讲实战方面的内容,本文主要会讲解接口测试中的一些接口概念,流程等方面的问答,同时还会介绍一下即将要进行测试的项目,这里呢我就不多说废话了,直接进入主题吧。 二、接口概念 接口测试&…...
浏览器工作原理与实践--跨站脚本攻击(XSS):为什么Cookie中有HttpOnly属性
通过上篇文章的介绍,我们知道了同源策略可以隔离各个站点之间的DOM交互、页面数据和网络通信,虽然严格的同源策略会带来更多的安全,但是也束缚了Web。这就需要在安全和自由之间找到一个平衡点,所以我们默认页面中可以引用任意第三…...
Ubuntu配置VScode的C++环境
在Ubuntu系统下配置C环境,并运行helloworld 1. 下载VScode 我这里使用的是星火应用商店,在商店里面可以直接下载安装 http://spark-app.store/ 2.创建文件夹 3.启动VScode并打开该文件夹 4.安装以下几个扩展 PS:Clang这个插件别安装&…...
使用Code开发Django_模版和CSS
转到定义 和 查看定义 在使用Django或任何其他库的过程中,我们可能需要检查这些库中的代码。VS Code提供了两个方便的命令,可以直接导航到任何代码中的类和其他对象的定义: 转到定义 在Python开发环境中,我们可以轻松地对函数、类或者其他导入模块中的成员使用“Go to Def…...
Llama 3下月正式发布,继续开源!
4月10日,Techcrunch消息,Meta在本周伦敦举办的一场活动中确定,下个月将正式发布Llama 3并且继续开源。 Meta全球事务总裁Nick Clegg表示,我们希望在下个月,甚至更短的时间内,正式推出新一代基础模型Llama …...
有图片转成PDF文件格式的方法吗?分享图片转成PDF文件的方法
将图片转换为PDF文件是一个相对简单的过程,但也需要一定的步骤和注意事项。下面,我将详细介绍如何将图片转换为PDF文件,包括所需的工具、步骤以及可能遇到的问题和解决方案。 首先,我们需要一个能够将图片转换为PDF文件的工具。市…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
力扣热题100 k个一组反转链表题解
题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...
Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...
