【示例】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提供的一种索引优化功能,可以减少回表次数,提高查询效率。

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

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

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

相关文章

状态模式【行为模式C++】

1.概述 状态模式是一种行为设计模式&#xff0c; 让你能在一个对象的内部状态变化时改变其行为&#xff0c; 使其看上去就像改变了自身所属的类一样。 2.结构 State(抽象状态类)&#xff1a;定义一个接口用来封装与上下文类的一个特定状态相关的行为&#xff0c;可以有一个或多…

element问题总结之el-table使用fixed固定列后滚动条滑动到底部或者最右侧的时候错位问题

el-table使用fixed固定列后滚动条滑动到底部或者最右侧的时候错位 效果图前言解决方案纵向滑动滚动条滑动到底部的错位解决横向滚动条滑动到最右侧的错位解决 效果图 前言 在使用el-table固定行的时候移动滚动条会发现移动到底部或者移动到最右侧的时候会出现表头和内容错位或…

Mac电脑安装蚁剑

1&#xff1a; github 下载源码和加载器&#xff1a;https://github.com/AntSwordProjectAntSwordProject GitHubAntSwordProject has 12 repositories available. Follow their code on GitHub.https://github.com/AntSwordProject 以该图为主页面&#xff1a;antSword为源码…

PHPStudy(小皮)切换PHP版本PDO拓展失效的问题

因为要看一个老项目&#xff0c;PHP版本在8.0以上会报错&#xff0c;只能切换到7.2&#xff0c;但又遇到了PDO没开启的问题。 PHPStudy上安装的PHP7.2是需要自己配置一下的&#xff0c;里面php.ini文件是空的&#xff0c;需要将php.ini-development改成php.ini&#xff0c;对于…

PCL使点云产生毛刺

一、代码 C++ #include <pcl/point_types.h> #include <pcl/point_cloud.h> #include <pcl/io/pcd_io.h> #include <pcl/io/ply_io.h> #include <random> #include <pcl/visualization/pcl_visualizer.h> #include <boost/thread/thr…

【每日刷题】Day15

【每日刷题】Day15 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; 目录 1. 141. 环形链表 - 力扣&#xff08;LeetCode&#xff09; 2. 142. 环形链表 II - 力扣&#xff08;LeetCode&#xff09; 3. 143. 重…

ROS 2边学边练(25)-- 将多个节点组合到一个进程

前言 在ROS 2中&#xff0c;将多个节点&#xff08;Nodes&#xff09;组合到一个单独的进程&#xff08;Process&#xff09;中通常指的是使用“Composable Nodes”的特性。这个特性允许你定义可复用的组件&#xff08;Components&#xff09;&#xff0c;然后将这些组件加…

WPF-基础及进阶扩展合集(持续更新)

目录 一、基础 1、GridSplitter分割线 2、x:static访问资源文件 3、wpf触发器 4、添加xaml资源文件 5、Convert转换器 6、多路绑定与多路转换器 二、进阶扩展 1、HierarchicalDataTemplate 2、XmlDataProvider从外部文件获取源 3、TextBox在CellTemplate中的焦点问题…

系统边界图

系统边界图的定义&#xff1a; 系统边界图是系统工程和软件工程中的一种图形化工具&#xff0c;用于描述系统与外部世界之间的交互和界限。它展示了系统的组成部分以及这些组件如何与外部实体进行通信和交互。系统边界图通常包括系统内部的各个组件、外部实体以及它们之间的通信…

大厂100 NLP interview questions外企

CLASSIC NLP TF-IDF & ML (8) Write TF-IDF from scratch. What is normalization in TF-IDF ? Why do you need to know about TF-IDF in our time, and how can you use it in complex models? Explain how Naive Bayes works. What can you use it for? How can…

考研数学究竟有多难?基础差该如何复习?

考研数学的难度是相对的&#xff0c;它取决于考生的数学基础、备考时间、复习效率和解题技巧等多个因素。从历年的考试情况来看&#xff0c;考研数学确实具有一定的挑战性&#xff0c;主要体现在以下几个方面。 首先是知识覆盖面广&#xff0c;考研数学涵盖了高等数学、线性代…

集群伸缩简介

4.2.1.小结 Redis如何判断某个key应该在哪个实例&#xff1f; 将16384个插槽分配到不同的实例根据key的有效部分计算哈希值&#xff0c;对16384取余余数作为插槽&#xff0c;寻找插槽所在实例即可 如何将同一类数据固定的保存在同一个Redis实例&#xff1f; 这一类数据使用…

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

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

1042: 中缀表达式转换为后缀表达式

解法&#xff1a;直接给算法 创建一个栈和一个空的后缀表达式字符串。 遍历中缀表达式中的每个字符。 如果当前字符是操作数&#xff0c;直接将其添加到后缀表达式字符串中。 如果当前字符是操作符&#xff0c;需要将其与栈顶的操作符进行比较&#xff1a; 如果栈为空&#…

【Python标准库】多线程threading

1.多线程 让程序能够执行多个任务&#xff0c;比如下载多张图片&#xff0c;创建多个线程 2.多线程语法 # 1.导包 from threading import Thread# 2.创建任务即函数 def func_01():# 无参print("哈喽")def func_02(name):# 有参print(f"{name},您好")if …

Mac下载的软件显示文件已损坏,如何解决文件已损坏问题

当在Mac上下载的软件显示文件已损坏时&#xff0c;这可能是因为多种原因导致的&#xff0c;包括网络问题、下载中断、软件未完整下载、文件传输错误等。解决这个问题需要采取一些步骤来排除可能的原因&#xff0c;并尝试修复文件。下面将详细介绍一些常见的解决方法&#xff1a…

Qt-绘制多边形、椭圆、多条直线

1、说明 所有的绘图操作是在绘图事件中进行。mainwindow.h #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public QMainWindow {Q_OBJECTpublic:MainWi…

【详解算法流程+程序】DBSCAN基于密度的聚类算法+源码-用K-means和DBSCAN算法对银行数据进行聚类并完成用户画像数据分析课设源码资料包

DBSCAN(Density-Based Spatial Clustering of Applications with Noise)是一个比较有代表性的基于密度的聚类算法。 与划分和层次聚类方法不同&#xff0c;它将簇定义为密度相连的点的最大集合&#xff0c;能够把具有足够高密度的区域划分为簇&#xff0c; 并可在噪声的空间数据…

linux监控文件操作行为

linux监控文件操作行为 使用 auditd 系统 auditd 是Linux系统的一个安全和审计系统&#xff0c;它能够跟踪系统上发生的安全相关事件。要使用 auditd 来监控文件&#xff0c;你需要首先确保 auditd 已经安装并且运行在你的系统上。 然后&#xff0c;你可以使用 auditctl 命令…

MES管理系统中生产物料管理的设计

在数字化工厂建设的浪潮中&#xff0c;MES管理系统作为执行层的核心管理系统&#xff0c;其重要性日益凸显。特别是在生产物料管理方面&#xff0c;MES管理系统不仅承担物料计划指令的接收&#xff0c;还负责物料派工及使用反馈的数据收集&#xff0c;其业务流程的设计对数字化…