Spring Boot日志

目录

一、日志概述

1、为什么要学习日志?

2、日志的用途

(1)系统监控 

(2)数据采集

(3)日志审计

二、日志使用

1、打印日志

(1)在程序中得到日志对象

(2)使用日志对象打印日志

2、日志框架介绍

(1)门面模式(外观模式)

门面模式定义

(2)门面模式的实现

灯接口代码:

卧室灯代码:

走廊灯接口:

灯门面的代码:

main方法的代码:

(3)门面模式的优点

(4)SLF4J 框架介绍

不引入日志门面:

引入日志门面:

3、日志格式的说明

4、日志级别

(1)日志级别的分类

(2)日志级别的使用

5、日志配置

(1)配置日志级别

(2)日志持久化

配置日志文件的路径和文件名:

配置日志文件的保存路径:

(3)配置日志文件分割

(4)配置日志格式

配置项说明:

三、更简单的日志输出

1、添加lombok依赖

2、输出日志

四、总结


一、日志概述

1、为什么要学习日志?

        之前在学习JavaSe部分,使用System.out.println打印日志,观察、发现问题所在,追踪问题源头,在学习Spring的阶段,也经常需要根据控制台的日志来分析和定位问题

        随着项目的复杂度提升,我们对日志的打印也有了更高的需求,不仅仅是定位排查问题。

        比如:需要记录一些用户操作记录(一些审计公司会要求),也可能需要使用日志来记录用户的一些喜好,把日志持久化,后续进行数据分析等。但是System.out.print不能很好的满足我们的需求,我们就需要使用一些专门的日志框架(专业的事情交给专业的人去做)

2、日志的用途

        通过前面的学习,我们知道日志主要是为了发现问题、分析问题、定位问题的,但除此之外,日志还有很多用途。

(1)系统监控 

        监控现在几乎是一个成熟系统的标配,我们可以通过日志记录这个系统的运行状态,每一个方法的响应时间、响应状态等,对数据进行分析,设置不同的规则,超过阈值时进行报警。比如统计日志中关键字的数量,并在关键字数量达到一定条件时报警,这也是日志的常见需求之一

(2)数据采集

        数据采集是一个比较大的范围,采集的数据可以作用在很多方面,比如数据统计,推荐排序等

数据统计:统计页面的浏览量(PV),访客量(UV),点击量等等,根据这些数据进行数据分析,优化公司运营策略。

推荐排序:目前推荐排序应用在各个领域,我们经常接触的各行各业,很多也都涉及推荐排序,比如购物、广告、新闻等领域。数据采集是推荐排序工作中必须做的一环,系统通过日志记录用户的浏览历史,停留时长等,算法人员通过分析这些数据,训练模型,给用户做推荐。

        下图的数据源,其中一部分就来自于日志记录的数据。

(3)日志审计

        随着互联网的发展,众多企业的关键业务越来越多的运行于网络之上。网络安全越来越受到大家的关注,系统安全也成为项目中的一个重要环节,安全审计也是系统中非常重要的部分。国家的政策法规、行业标准等都明确对日志审计提出了要求通过系统日志分析,可以判断一些非法攻击,非法调用,以及系统处理过程中的安全隐患

比如,大家平时都在做运营系统,其中运营人员在通过界面处理一些数据的时候,如果没有清楚的日志操作记录,一条数据被删除或者修改,你是无法找到是谁操作的,但是如果做了相应的记录,该数据被谁删除或者修改,就会一目了然

还有一些内部的违规和信息泄露(比如客户信息被卖掉)现象出现后,如果未记录留存日志,为事后调查提供依据,则事后很难追查(一些公司查看客户信息都会被记录日志,如果频繁的查询也会报警)


二、日志使用

        Spring Boot项目在启动时,默认就有日志输出,如下图:

        和我们使用System.out.println打印的日志不同,它打印的是如下图:

        可以看到,我们通过System.out.println打印的日志,相比于Spring Boot打印的日志,少了很多信息。

        而Spring Boot内置了日志框架:Slf4j ,我们可以直接在程序中调用 Slf4j 来输出日志。

1、打印日志

        打印日志的步骤:

1、在程序中得到日志对象

2、使用日志对象输出要打印的内容

(1)在程序中得到日志对象

        在程序中获取日志对象需要使用日志工程 LoggerFactory,如下代码所示:

private static Logger logger = LoggerFactory.getLogger(LoggerFactory.class);

        LoggerFactory.getLogger需要传递一个参数,标识这个日志的名称。这样就可以更清晰的知道是哪个类输出的日志。当有问题时,可以更方便直观的定位到问题类。

注意:Logger对象是属于 org.slf4j 包下的,不要导入错包。

(2)使用日志对象打印日志

        日志对象的打印方法有很多种,我们可以先使用 info() 方法来输出日志,代码如下:

@RequestMapping("/logger")
@RestController
public class LoggerController {
    private static Logger logger = LoggerFactory.getLogger(LoggerFactory.class);
    @RequestMapping("/print")
    public String print() {
        logger.info("使用日志对象打印日志");
        System.out.println("使用sout打印日志");
        return "success";
    }
}

        浏览器访问:127.0.0.1/logger/print ,页面如下:

        控制台输出的内容如下:

2、日志框架介绍

        SLF4J 不同于其他日志框架,它不是一个真正的日志实现,而是一个抽象层对日志框架制定的一种规范、标准、接口。所以SLF4J并不能独立使用,需要和具体的日志框架配合使用

(1)门面模式(外观模式)

        SLF4J是门面模式的典型应用(但不仅仅使用了门面模式)。

门面模式定义

        门面模式(Facade Pattern)又称为外观模式,提供了一个统一的接口,用来访问子系统中的一群接口。其主要特征是定义了一个高层接口,让子系统更容易使用。

原文:Provide a unified interface to a set ofinterfaces in a subsystem.Facade defines a higher-level interface that makes the subsystem easier to use.

解释:求一个子系统的外部与其内部的通信必须通过一个统一的对象进行。门面模式提供一个高层次的接口,使得子系统更易于使用。

        门面模式主要包含2种角色:

外观角色(Facade)也称门面角色,系统对外的统一接口

子系统角色(SubSystem)可以同时有一个或多个 SubSystem。每个 SubSystem 都不是一个单独的类,而是一个类的集合。SubSystem并不知道Facade的存在,对于SubSystem而言,Facade只是另一个客户端而已(即Facade对SubSystem透明)

(2)门面模式的实现

        场景:回家,我们会开各个屋的灯。离开家时,会关闭各个屋的灯。如果家里设置一个总开关,来控制整个屋的灯就会很方便。

        我们使用门面模式的实现:

灯接口代码:
public interface Light {
    void on();
    void off();
}
卧室灯代码:
public class BedRoomLight implements Light{
    @Override
    public void on() {
        System.out.println("打开卧室灯");
    }
    @Override
    public void off() {
        System.out.println("关闭卧室灯");
    }
}
走廊灯接口:
public class HallLight implements Light{
    @Override
    public void on() {
        System.out.println("打开走廊灯");
    }
    @Override
    public void off() {
        System.out.println("关闭走廊灯");
    }
}
灯门面的代码:
public class LightFacade {
    private Light bedRoomLight = new BedRoomLight();
    private Light hallLight = new HallLight();
    public void lightOn() {
        bedRoomLight.on();
        hallLight.on();
    }
    public void lightOff() {
        bedRoomLight.off();
        hallLight.off();
    }
}
main方法的代码:
public class Main {
    public static void main(String[] args) {
        LightFacade lightFacade = new LightFacade();
        lightFacade.lightOn();
        lightFacade.lightOff();
    }
}

        执行结果如下:

(3)门面模式的优点

        1、减少了系统的相互依赖降低了客户端与子系统的耦合,这使得子系统的变化不会影响到调用它的客户端

例如,我修改了卧室灯的方法名,客户端这边不需要修改代码,只需要修改灯门面的代码即可,客户端和子系统实现了解耦的效果。如图:

灯门面修改这里即可,main方法的代码不需要改变。如图:

(这里报红了是因为实现了接口,所以方法名是不能变的,这里只是举个例子)

        2、提高了灵活性,简化了客户端对子系统的使用难度客户端无需关心子系统的具体实现方式,而只需要和门面对象交互即可

        3、提高了安全性可以灵活设定访问权限,不在门面对象中开通方法,就无法访问

(4)SLF4J 框架介绍

        SLF4J 就是其他日志框架的门面。SLF4J可以理解为是提供日志服务的统一API接口,并不涉及到具体的日志逻辑实现。

不引入日志门面:

        常见的日志框架有log4J、logback等。如有一个项目已经使用了log4J,而你依赖的另一个类库,假设是Apache Active MQ,它依赖于另外一个日志框架logback,那么你就需要把logback也加载进去。如图:

存在的问题

1不同日志框架的API接口陪配置文件不同,如果多个日志框架共存,那么就不得不维护多套配置文件了(这里的配置文件是指用户自定义的配置文件)

2如果更换日志框架,应用程序将不得不修改代码,并且修改过程中可能会存在一些代码冲突

3如果引入的第三方框架,需要使用了多套配置文件,那就不得不维护多套配置文件了

引入日志门面:

        引入门面日志框架之后,应用程序和日志框架(框架的具体实现)之间就有了统一的API接口(门面日志框架实现),此时应用程序只需要维护一套日志文件配置,且当底层实现框架改变时,也不需要更改应用程序的代码。如图:

        SLF4J就是这个日志门面。总的来说,SLF4J使你的代码独立于任意一个特定的日志API,这是一个对开发API的开发者很好的思想。

3、日志格式的说明

        打印的日志分别代码什么呢?如图:

4、日志级别

        日志级别代表日志信息对应问题的严重性,为了更快的筛选符合目标的日志信息。

        试想一下,一个有2w员工的公司,如果每一件琐事、问题都要反映给老板,老板肯定是处理不过来的,所以就有了组织架构,而组织架构会进行分级,会有很多级别的设置,如图:

        有了组织架构后,就可以逐级别汇报消息了,例如:组员汇报给组长,组长汇报给研发一组,研发一组汇报给Java研发,等等依次进行汇报。

        日志级别大概是同样的道理,有了日志级别之后,就可以过滤想看到的信息了,比如只关注ERROR级别的,就可以根据级别过滤出来ERROR级别的日志信息,节约开发者的信息筛选时间

(1)日志级别的分类

        日志的级别从高到低依次分为:FATAL、ERROE、WARN、INFO、DEBUG、TRACE

FATAL致命信息,表示需要立即被处理的系统级错误

ERROR错误信息,级别较高的错误日志信息,但仍然不影响系统的继续运行

WRAN警告信息,不影响使用,但需要注意的问题

INFO普通信息,用于记录应用程序正常运行时的一些信息,例如系统启动完成、请求处理完成等

DEBUG调试信息,需要调试时候的管家信息打印

TRACE追踪信息,比DEBUG更细粒度的信息事件(除非有特殊用意,否则请使用DEBUG级别替代)

日志级别的顺序

        级别越高,收到的消息越少

(2)日志级别的使用

        日志级别是开发人员自己设置的开发人员根据自己的理解来判断该信息的重要程度。(类似公司管理,通常由领导来判断什么样的事情需要汇报,什么样的事情不需要汇报)

        Spring Boot默认的日志框架是LogbackLogback没有FATAL级别的日志,它被映射到ERROR我们也可以想想,如果出现fatal日志,表示服务已经出现了某种程度的不可用,需要系统管理员紧急介入处理。通常情况下,一个进程生命周期中应该最多只有一次FATAL记录

        针对这些级别,Logger 对象分别提供了对应的方法,来输出日志。代码如下:

@RequestMapping("/logger")
@RestController
public class LoggerController {
    @RequestMapping("/level")
    public String levelPrint() {
        logger.trace("=======trace级别的日志==========");
        logger.debug("=======debug级别的日志==========");
        logger.info("=======info级别的日志===========");
        logger.warn("=======warn级别的日志==========");
        logger.error("=======error级别的日志==========");
        return "success";
    }
}

        浏览器输入:127.0.0.1:8080/logger/level ,页面如下:

        控制台输出内容如下:

        观察打印日志的结果,只打印了info、warn、error,并没有输出trace、debug。这与日志级别的配置有关,日志的输出级别默认最低级是到info级别,所以只会打印大于等于次级别的日志,也就只会打印info、warn、error

        上面是日志的使用,日志框架还支持我们更灵活的输出日志,包括内容、格式等。

5、日志配置

(1)配置日志级别

        日志级别配置只需要在配置文件中设置 “logging.level” 配置项即可,如下所示:

properties配置:

logging.level.root=debug

yml配置:

logging:
  level:
    root: debug

        重新运行上面代码,控制台打印内容:

        日志多了debug级别的。

(2)日志持久化

        以上的日志都是输出在控制台上的,然而在线上环境中,我们需要把日志保存下来,以便出现问题之后追溯问题。而把日志保存下来,就叫做 持久化。

        日志持久化有两种方式:1、配置日志文件名(logging.file.name) 2、配置日志的存储目录(logging.file.path)

配置日志文件的路径和文件名:

        properties配置:

logging.file.name=logger/springboot.log

        yml配置:

logging:
  file:
    name: logger/springboot.log

        name后面可以跟绝对路径或者相对路径。运行项目后,日志内容保存在了对应的目录下,如图:

        

配置日志文件的保存路径:

        properties配置:

logging.file.path=D:/temp

        yml配置:

logging:
  file:
    path: D:/temp

        运行项目,该路径下会多出一个日志文件,如图:

其中,logging.file.nam和logging.file.path同时存在的话只会,只会生效一个,一logging.file.name为准。

(3)配置日志文件分割

        如果我们的日志都放在一个文件中,随着项目的运行,日志文件会越来越大,需要对日志文件进行分割日志框架也考虑到了这一点,所以如果不进行配置,就走自动配置,默认日志文件超过10M就进行分割

        properties配置:

logging.logback.rollingpolicy.file-name-pattern=${LOG_FILE}.%d{yyyy-MM-dd}.%i
logging.logback.rollingpolicy.max-file-size=1KB

        yml配置:

logging:
  logback:
    rollingpolicy:
      max-file-size: 1KB
      file-name-pattern: ${LOG_FILE}.%d{yyyy-MM-dd}.%i

(4)配置日志格式

        打印日志的格式,也是支持配置的支持控制台和日志文件分别设置

配置项说明:

1%clr(表达式){颜色}设置输入日志的颜色,支持也是有:blue、cyan、faint、green、magenta、red、yellow

2%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX}} 日期和时间--精确到毫秒

%d{}⽇期
${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd'T'HH:mm:ss.SSSXXX} 非空表达式,获取
系统属性 LOG_DATEFORMAT_PATTERN ,若属性 LOG_DATEFORMAT_PATTERN 不存在,则使用 -yyyy-MM-dd HH:mm:ss.SSSXXX 格式,系统属性可以从System.getProperty("LOG_DATEFORMAT_PATTERN") 获取

3%5p 显示日志级别ERROR、WARN、INFO、DEBUG、TRACE

4%t 线程名。%c 类的全限定名。%M method。 %L 为行号。%thread线程名称。%m或者%msg显示输出消息。%n换行符

5%5若字符长度小于5,则右边用空格填充。%-5若字符长度小于5,则左边空格填充。%.15若字符长度超过15,截去多余字符。%15.15若字符长度小于15,则右边用空格填充。若字符长度超过15,截去多余字符

更多说明,参考:Chapter 6: Layouts (qos.ch)

Properties配置:

logging.pattern.console='%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'

yml配置:

logging:
  pattern:
    console: '%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'
    file: '%d{yyyy-MM-dd HH:mm:ss.SSS} %c %M %L [%thread] %m%n'

        启动项目,打印的日志格式是这样的:

        通常情况下,使用默认的日志打印即可。

        这里如果要修改颜色,还要去setting->Runner->VM Options添加:Dspring.output.ansi.enabled=ALWAYS,如图:

        因为我的是专业版,控制台输出的日志默认就有颜色了,这里我就没有添加这个内容。


三、更简单的日志输出

        每次都使用LoggerFactory.getLogger(xxx.class)很繁琐,且每个类都要添加一遍,lombok给我们提供了一种更简单的方式。

第一步添加lombok框架支持

第二步使用@slf4j注解输出日志

1、添加lombok依赖

2、输出日志

        代码如下:

@Slf4j
@RequestMapping("/logger2")
@RestController
public class LoggerController2 {
    @RequestMapping("/log")
    public String log() {
        log.info("打印日志");
        return "success";
    }
}

        浏览器输入:127.0.0.1:8080/logger2/log ,浏览器页面如下:

        

        控制台输入内容如下:

        lombok提供的@Slf4j会帮我们提供一个日志对象log,我们直接使用就可以。如图:


四、总结

1日志是程序中的最重要组成部分,使用日志可以快速的发现和定位问题,Spring Boot内容包含了日志框架,默认情况下使用的是info日志级别将日志输出到控制台,我们可以通过lombok提供的@Slf4j注解和log对象快速的打印自定义日志

2日志包含6个级别,日志级别越高,收到的日志信息就越少,我们可以通过配置日志的保存名称或者保存目录来将日志持久化

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录训练营Day 27|理论基础、力扣 77. 组合

1.理论基础 题目链接/文章讲解:代码随想录 视频讲解:带你学透回溯算法(理论篇)| 回溯法精讲!_哔哩哔哩_bilibili 来自代码随想录的网站: void backtracking(参数) {if (终止条件) {存放结果;return;}for (…

Linux 服务器配置共享文件夹(NFS)

一、准备三台 linux 服务器 三台服务器: manger:172.16.11.178 ap1:172.16.11.179 ap2:172.16.11.180 /root/serverfiles/ 为共享目录 二、配置步骤 1、在服务端01的机器上安装nfs和rpcbind程序 yum -y install nfs* yum -y install rpcbind* 2、在安装完nfs以及rpcb…

RabbitMQ(四种使用模式)

文章目录 1.Fanout(广播模式)1.基本介绍2.需求分析3.具体实现1.编写配置类 RabbitMQConfig.java2.编写生产者,发送消息到交换机 MQSender.java3.编写消费者,接受消息 MQReceiver.java4.控制层调用方法,发送信息到交换机…

文件流-ASCII文件(中北大学-程序设计基础(2))

目录 题目 源码 结果示例 题目 编写程序实现以下功能:【要求处理ASCII文件】 (1)按职工号由小到大的顺序将5个员工的数据(包括号码、姓名、年龄和工资)输出到磁盘文件中保存; (2&#xff…

DIFT:Emergent Correspondence from Image Diffusion # 论文阅读

URL https://arxiv.org/pdf/2306.03881 主页:https://diffusionfeatures.github.io/ 代码:https://github.com/Tsingularity/dift TD;DR 23 年 6月 cornell 大学的文章,任务是做图片的特征匹配(关联),特…

让 计算机 将 数学 公式 表达式 的计算过程绘制出来 【mathematical-expression(MAE)】

目录 文章目录 目录介绍开始实战引入数学表达式计算库引入流程图代码生成库开始进行生成 介绍 大家好 今天我们来分享一个新知识,将数学表达式的整个计算过程,以及计算繁多结果在 Java 中绘制出来,计算机中的数学表达式计算的功能很常见了&a…

编码器介绍与应用

一.概述 1.编码器 编码器,是一种用来测量机械旋转或位移的传感器。这种传感器能够测量机械部件在旋转或直线运动时的位移位置或速度等信息,并将其转换成一系列电信号。其可和电机组装到一起用,反馈电机方向、转换角度的,然后电机…

2024电商数据资料汇总

2024年跨境电商:连接全球市场的新纪元 随着全球数字化进程的不断推进,跨境电商已经成为了国际贸易的重要组成部分。2024年,跨境电商行业迎来了一系列挑战和机遇,塑造了全新的市场格局。 跨境电商市场规模的持续扩大 2024年&…

基于微信小程序+JAVA Springboot 实现的【马拉松报名系统】app+后台管理系统 (内附设计LW + PPT+ 源码+ 演示视频 下载)

项目名称 项目名称: 马拉松报名系统微信小程序 项目技术栈 该项目采用了以下核心技术栈: 后端框架/库: Java SSM框架数据库: MySQL前端技术: 微信开发者工具、uni-app其他技术: JSP开发技术 项目展示 …

【异常处理】(中北大学-程序设计基础(2))

目录 题目 源码 结果示例 题目 求一元二次方程式ax^2bxc0的实根&#xff0c;如果方程没有实根&#xff0c;则输入有关警告信息。要求&#xff1a;建立一元二次方程类&#xff0c;利用异常技术处理。 源码 #include <iostream> #include <cmath>using namespa…

网络基础-SSH协议(思科、华为、华三)

SSH&#xff08;Secure Shell&#xff09;是一种用于安全远程访问和安全文件传输的协议。它提供了加密的通信通道&#xff0c;使得用户可以在不安全的网络上安全地远程登录到远程主机&#xff0c;并在远程主机上执行命令、访问文件以及传输文件&#xff0c;本篇主要讲解命令执行…

LLM实战:LLM微调加速神器-Unsloth + LLama3

1. 背景 五一结束后&#xff0c;本qiang~又投入了LLM的技术海洋中&#xff0c;本期将给大家带来LLM微调神器&#xff1a;Unsloth。 正如Unsloth官方的对外宣贯&#xff1a;Easily finetune & train LLMs; Get faster with unsloth。微调训练LLM&#xff0c;可以显著提升速…

【JavaEE初阶系列】——博客系统(编写服务器/前后端交互代码)

目录 &#x1f6a9;部署页面需求 &#x1f6a9;准备工作 &#x1f6a9;获取博客列表页 &#x1f6a9;博客详情页 &#x1f6a9;实现登录页面 &#x1f388;强制要求登录 &#x1f388;显示用户信息 &#x1f6a9;退出登录 &#x1f6a9;发布博客 &#x1f6a9;部署页面…

宝塔助手v1.4.1/手机操控云服务器的神器软件

宝塔助手是以宝塔Linux面板提供的API开发的一款可以随时随地管理服务器的APP。通过这款APP你可以随时随地的查看一台或多台服务器的运行情况&#xff0c;对服务器网站、FTP、数据库、文件进行管理。内置文件编辑器&#xff0c;可以对网站文件进行修改。 链接&#xff1a;https:…

三极管 导通条件

一、三极管理解 三极管是电子行业常用的元器件之一&#xff0c;他是一种电流型控制的器件&#xff0c;他有三种工作状态&#xff1a;截止区&#xff0c;放大区、饱和区。当三极管当做开关使用时&#xff0c;他工作在饱和区。下面简短讲解三极管作为开关使用的方法&#xff0c;只…

李飞飞团队关于2024年人工智能发展报告总结 (Artificial Intelligence Index Report)

目录 1 10大核心信息2 AI研究和发展2.1 核心要点2.2 核心对比信息2.3 模型是否会用尽数据2.4 基础模型发展2.5 训练模型成本 3 技术性能3.1 核心要点3.2 重要模型发布情况3.3 AI表现情况3.4 多学科、高难度评估集 (MMMU & GPQA & ARC)3.5 Agents3.6 RLHF & RLAIF3.…

花了3天编制了236份excel财务明细收支报表,自动公式,直接用

财务明细收支报表能够帮助管理者清晰地了解企业的财务状况&#xff0c;及时调整经营策略。财务收支报表也是评估企业偿债能力和盈利能力的重要依据。 一份标准的财务明细收支报表通常包括以下部分&#xff1a;标题、报表期间、收入明细、支出明细、净收入或净支出等。 在制作…

在cmd中,如何使用cd进入指定文件目录

在cmd中&#xff0c;如何使用cd进入指定文件目录 1.要进入的磁盘与当前磁盘一致 例如: cd C:\Program Files (x86)\Google\Chrome\Application 2.进入到其他磁盘&#xff0c; 例如 cd /d D:\JAVA\codes\01\1.4 或者下面的方式&#xff08;直接输入磁盘F&#xff1a;和文件名…

【UE5 C++】基础学习笔记——01 UObject的创建与使用

目录 步骤 一、创建UObject 二、创建基于UObject的蓝图类 三、在UObject中使用变量和函数 步骤 一、创建UObject 在内容浏览器中新建一个C类 父类选择“Object” 类的类型设置为公有&#xff0c;这里就命名为“MyObject”&#xff0c;点击“创建类”来创建头文件和源文…

【联合索引】最左匹配原则是什么?

什么是联合索引 联合索引&#xff08;Composite Index&#xff09;是一种索引类型&#xff0c;它由多个列组成。 MySQL的联合索引&#xff08;也称为复合索引&#xff09;是建立在多个字段上的索引。这种索引类型允许数据库在查询时同时考虑多个列的值&#xff0c;从而提高查询…