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

深入理解MySQL索引:原理、数据结构与优化策略

深入理解MySQL索引:原理、数据结构与优化策略

MySQL 是当今最流行的开源关系型数据库管理系统之一,其强大的性能与灵活的可扩展性使得它广泛应用于各种规模的应用程序中。在数据库的日常操作中,索引起着至关重要的作用,能够极大地提高查询效率。然而,索引的设计与使用并不总是那么直观,尤其是在面对复杂查询、海量数据和频繁更新时,如何有效地设计和优化索引成为一项重要的挑战。

本文将深入探讨 MySQL 索引的底层数据结构、聚簇索引与非聚簇索引的区别与应用场景,以及如何通过正确地使用索引来优化查询性能。我们还将详细讨论字段是否适合加索引的问题,特别是对于枚举字段的索引设计。此外,还会介绍 MySQL 读取数据时涉及的页、块等概念,以及它们对性能的影响。

一、MySQL 索引概述

1.1 什么是索引

索引类似于一本书的目录,它可以帮助我们快速定位到需要的内容。没有索引时,MySQL 需要遍历整个表来找到目标记录,而索引通过构建特定的结构,可以加速查找的过程。索引的主要作用是提高数据库查询效率,减少数据库检索的行数,从而提升查询速度。

在 MySQL 中,常见的索引类型包括以下几种:

  • B-Tree 索引:这是 MySQL 中最常见的索引结构,适用于大多数场景。B-Tree 是平衡树的一种,能够保持数据有序,从而加快查找速度。
  • 哈希索引(Hash Index):通过将键映射为固定大小的哈希值来加速查找,适用于精确查找。
  • 全文索引(Fulltext Index):用于对文本字段进行全文搜索的索引。
  • 空间索引(Spatial Index):用于处理 GIS(地理信息系统)数据的索引。

1.2 索引的作用

索引可以极大地提高查询效率,其作用主要表现在以下几个方面:

  • 加快检索速度:索引可以帮助数据库快速定位到目标数据,而无需扫描整个表。
  • 减少 I/O 操作:通过索引,可以显著减少磁盘 I/O 操作次数,从而加快查询响应时间。
  • 优化排序和分组:索引可以帮助数据库优化 ORDER BYGROUP BY 操作,尤其是对于大表数据的排序和分组需求。

1.3 索引的代价

尽管索引能够显著提高查询效率,但它也会带来一定的代价:

  • 增加存储空间:索引本质上是表的一个副本结构,维护索引需要额外的存储空间。
  • 影响写操作性能:在执行插入、删除和更新操作时,MySQL 需要同时更新表和索引,这会导致写操作性能下降。
  • 增加维护成本:随着表数据的增多和变化,索引需要维护和重建,这会消耗系统资源。

因此,在设计索引时,需要权衡其带来的性能提升与附加开销。

二、MySQL 索引的数据结构

2.1 B-Tree 数据结构

MySQL 的默认存储引擎 InnoDB 使用 B+Tree 作为索引的底层数据结构。B+Tree 是一种平衡树,每个节点可以有多个子节点,同时所有的数据都存储在叶子节点中。B+Tree 的特点是每个节点可以包含多个键,这使得树的高度相对较低,从而减少了查找时的磁盘 I/O 操作。

B+Tree 与 B-Tree 的区别
  • 数据存储位置不同:B+Tree 的非叶子节点只存储键值信息,而不存储具体的数据,所有数据都存储在叶子节点上。而 B-Tree 的每个节点都存储键值和数据。
  • 叶子节点链接:B+Tree 的叶子节点通过指针相连,形成一个有序的链表结构。这使得在范围查询时,可以直接遍历叶子节点,从而加快查询速度。
B+Tree 的优点
  1. 减少磁盘 I/O:B+Tree 是高度平衡的,树的高度相对较低,减少了查询时的磁盘读取次数。
  2. 有序性:B+Tree 保持数据的有序性,因此在范围查询时非常高效。
  3. 支持多种操作:B+Tree 不仅支持精确查找,还支持范围查找、排序查找等复杂操作。

2.2 聚簇索引与非聚簇索引

聚簇索引(Clustered Index)

聚簇索引是一种特殊的索引类型,在 MySQL 的 InnoDB 存储引擎中,聚簇索引将表中的数据按照主键的顺序存储。换句话说,聚簇索引将数据与索引紧密结合在一起,数据实际上存储在索引的叶子节点上。

在 InnoDB 中,每个表都有且只有一个聚簇索引,通常是主键。如果没有定义主键,InnoDB 会选择一个唯一非空的列作为聚簇索引;如果没有这样的列,InnoDB 会隐式创建一个内部主键作为聚簇索引。

优点

  • 聚簇索引可以加快基于主键的查询,因为数据按主键顺序存储,查找主键值时可以直接定位到数据。

缺点

  • 由于数据的存储顺序固定,插入和更新操作可能会涉及到数据的重排,从而降低写操作性能。
  • 如果主键较长,聚簇索引会占用较大的存储空间。
非聚簇索引(Non-Clustered Index)

非聚簇索引与聚簇索引不同,非聚簇索引的叶子节点不存储实际数据,而是存储指向数据行的指针(在 InnoDB 中为主键)。因此,当通过非聚簇索引查找数据时,MySQL 需要首先在非聚簇索引中找到指针,然后再通过聚簇索引定位到实际数据。

优点

  • 非聚簇索引适用于快速查找非主键列的值。
  • 一个表可以有多个非聚簇索引,这使得对不同列的查询能够利用不同的索引。

缺点

  • 由于非聚簇索引的叶子节点不直接存储数据,查询过程可能涉及额外的查找步骤,增加查询时间。

2.3 哈希索引

哈希索引是基于哈希表的数据结构,它通过将键映射为哈希值来加速查询。哈希索引的查找时间复杂度为 O(1),在精确查找时表现非常高效。然而,哈希索引也有一些局限性:

  1. 不支持范围查询:由于哈希索引是基于哈希值的映射,它不支持范围查询(如 BETWEENLIKE 操作)。
  2. 哈希冲突:当多个键映射到相同的哈希值时,哈希冲突会降低查询效率。

在 MySQL 中,InnoDB 存储引擎不直接支持哈希索引,然而,某些存储引擎(如 Memory 引擎)可以使用哈希索引。

三、字段索引设计与优化

3.1 字段是否加索引

在设计数据库索引时,选择哪些字段加索引至关重要。加索引的目的是为了提高查询性能,但如果滥用索引,可能会导致性能下降,尤其是在写操作频繁的表中。

通常来说,以下几种字段适合加索引:

  • 主键和唯一键:这些字段通常是聚簇索引或唯一索引的候选项。
  • 频繁用于查询条件的字段:如果一个字段经常出现在 WHERE 子句中,则可以考虑为该字段加索引。
  • 用于排序和分组的字段:如果一个字段经常出现在 ORDER BYGROUP BY 子句中,索引可以帮助优化排序和分组操作。
  • 连接字段:如果一个字段经常用于表连接(如 JOIN 操作),为该字段加索引可以加速连接查询。

3.2 枚举字段的索引设计

对于枚举字段,是否加索引需要根据具体情况来决定。枚举字段通常是离散的、值的范围较小的字段,因此在某些场景下,索引的效果可能并不显著。

举个例

子,假设有一个字段 status,其可能的值为:

  • 0:待提交
  • 1:已提交
  • 2:已完结
  • 3:已终止
  • 4:已删除

是否为这个字段加索引取决于以下几个因素:

  1. 数据分布:如果 status 字段的值高度集中,比如 80% 的行的 status 值为 1,加索引的效果可能并不理想,因为索引在这种情况下无法有效减少扫描的行数。

  2. 查询频率:如果应用程序中经常根据 status 字段进行查询(如 WHERE status = 1),那么为该字段加索引可能会带来性能提升。

  3. 查询模式:如果查询条件是精确匹配(如 status = 2),索引可以加速查询;但如果查询涉及范围查询或模糊查询,索引的效果会打折扣。

综上所述,对于枚举字段,是否加索引需要根据数据分布和查询模式来评估。在大多数情况下,对于枚举字段加索引的效果有限,尤其是在值的分布非常不均匀的情况下。

四、MySQL 数据读取的页、块与性能

4.1 页与块的概念

MySQL 将数据存储在磁盘上,而磁盘的读取单位通常为页(page)。InnoDB 存储引擎将磁盘中的数据组织成固定大小的页,通常为 16KB。每个页包含多行数据,在查询时,MySQL 会将整个页加载到内存中。

当查询需要的数据不在内存中时,MySQL 会通过磁盘 I/O 将对应的页加载到内存中。如果一个查询跨页读取数据,MySQL 需要执行多次 I/O 操作,这会影响查询性能。

4.2 跨页读取的影响

跨页读取指的是一个查询需要的数据分布在多个页中,而不是集中在同一个页上。这种情况会导致 MySQL 执行多个磁盘读取操作,从而增加查询时间。

跨页读取的影响可以通过以下几种方式来缓解:

  1. 优化索引设计:通过优化索引设计,确保查询能够命中尽可能少的页,从而减少跨页读取。
  2. 增加内存缓存:通过增加 MySQL 的缓冲池(Buffer Pool)大小,可以减少磁盘 I/O 次数,提升查询性能。
  3. 水平分表:如果表的数据量过大,可以通过水平分表的方式将数据分散到多个小表中,从而减少跨页读取。

4.3 页分裂与合并

在 InnoDB 中,页分裂和合并是两个与性能相关的重要操作。

  • 页分裂:当一个页被插入的新数据填满时,InnoDB 会将这个页分裂成两个页。页分裂会导致额外的磁盘 I/O 和内存开销。
  • 页合并:当删除大量数据后,InnoDB 可能会将相邻的页合并成一个页,以减少存储空间。

页分裂和合并会影响写操作的性能,因此在设计表和索引时,尽量避免频繁的页分裂和合并操作。

五、优化 MySQL 索引与查询性能

5.1 索引设计原则

  1. 尽量选择高选择性的字段加索引:高选择性的字段可以有效减少扫描的行数,从而提高查询效率。
  2. 避免在频繁更新的字段上加索引:索引的维护会影响写操作性能,因此在频繁更新的字段上加索引可能会带来较大的性能开销。
  3. 使用联合索引优化复杂查询:对于多个条件的查询,可以使用联合索引(Composite Index)来优化查询性能。联合索引的顺序应与查询条件的使用顺序一致。

5.2 查询优化策略

  1. 避免全表扫描:确保查询条件能够使用索引,避免全表扫描带来的性能问题。
  2. 减少跨页读取:通过优化索引设计和合理的分表策略,减少查询时的跨页读取操作。
  3. 适当使用缓存:通过增加缓冲池的大小,可以将更多的数据保留在内存中,减少磁盘 I/O 操作。
  4. 合理使用排序和分组:在排序和分组操作中,确保使用索引来加速查询,避免全表排序和分组带来的性能问题。

5.3 分析与监控

  1. 使用 EXPLAIN 分析查询计划:在进行查询优化时,可以使用 EXPLAIN 来分析查询计划,了解查询使用了哪些索引,以及查询的执行顺序。
  2. 监控慢查询日志:通过开启 MySQL 的慢查询日志,可以发现哪些查询耗时较长,从而有针对性地进行优化。

六、总结

MySQL 索引是数据库优化的重要工具,正确地使用索引可以极大地提升查询效率。然而,索引的设计和优化是一门复杂的艺术,需要根据具体的业务场景、数据分布和查询模式来进行权衡。在本篇文章中,我们深入探讨了 MySQL 索引的底层数据结构,详细分析了聚簇索引与非聚簇索引的区别与应用场景。同时,我们还探讨了字段是否适合加索引的问题,特别是对于枚举字段的索引设计进行了详细阐述。

在实际应用中,索引的设计需要结合数据库性能监控工具和查询分析工具,逐步进行优化。通过合理地设计索引、优化查询、调整数据库配置,可以有效提升 MySQL 的性能,确保应用程序在海量数据和复杂查询场景下的高效运行。

相关文章:

深入理解MySQL索引:原理、数据结构与优化策略

深入理解MySQL索引:原理、数据结构与优化策略 MySQL 是当今最流行的开源关系型数据库管理系统之一,其强大的性能与灵活的可扩展性使得它广泛应用于各种规模的应用程序中。在数据库的日常操作中,索引起着至关重要的作用,能够极大地…...

mysql数据库基础使用

1、登录mysql ① 本地登录 mysql -u 用户名 -p ②远程登入 mysql -h ip主机地址 -P 端口号 -u 用户名 -p 回车输入密码即可. 2、关于用户操作 ①创建用户 % 代表所有ip都可以访问,可指定主机ip create user 用户名% identified by 密码; ②修改密码 alte…...

GATK AlleleList接口介绍

在 GATK(Genome Analysis Toolkit)中,AlleleList 接口是一个用来表示等位基因(alleles)列表的接口。Allele 是遗传学中用于表示某一特定基因座的不同形式的一个基本单位。AlleleList 接口定义了一些操作,使得处理和访问一组等位基因更加方便。 AlleleList 的实现类和继承…...

直播App遭受抓包后的DDoS与CC攻击防御策略

随着直播应用的普及,越来越多的用户开始依赖这些平台进行娱乐和社交活动。然而,这也使得直播平台成为网络攻击的目标之一。其中,DDoS(分布式拒绝服务)攻击和CC(Challenge Collapsar,即HTTP慢速攻…...

【xilinx】 AXI Quad SPI IP - 如果 s_axi_wstrb 不等于 0xf,则寄存器可能无法正确更新

PG153 (v3.2) 规定如下: “AXI4-Lite 写访问寄存器由 32 位 AXI 写数据 (* _wdata ) 信号更新,并且不受 AXI 写数据选通 (* _wstrb ) 信号的影响。” "The AXI4-Lite write access register is updated by the 32-bit AXI Write Data (* _wdata ) s…...

【EPLAN】P8 2.9 使用不了ePLUSE

【更多软件使用问题请点击亿道电子官方网站】 1、 文档目标 解决 EPLAN P8 2.9 使用不了ePLUSE问题 2、 问题场景 客户反应 EPLAN P8 2.9 版本打开后使用不了 ePLUSE 功能,如图 1 所示 EPLAN ePLUSE 界面为空白状态,无法使用。 图 1 3、软硬件环境 …...

页面设计任务 个人简介页面

目录 任务要求 任务讲解 源码: 详细讲解 html部分 CSS部分 任务要求 页面结构: 创建一个基本的 HTML 页面,页面标题为“我的个人简介”。页面内容分为以下四个部分: 顶部导航栏: 包含至少三个导航链接,例如:“主页”、“关于…...

机械学习—零基础学习日志(如何理解概率论3)

随机变量的函数分布 一维随机变量分布,可以看到下图,X为不同情况的概率。而x如果是大于等于X,那么当x在40以内时,没有概率,为0。 当x变大,在40-80之间,那么x大于X的概率为,0.7&…...

YOLOv8添加SE注意力机制有效提升检测精度(已跑通)

SE注意力机制概念 SSqueeze-and-Excitation (SE) 注意力机制是一种专注于增强网络模型对不同特征通道的重要性理解的机制。它通过对通道维度上的特征进行动态调整,增强了网络对重要特征的敏感性。 源码 import numpy as np import torch from torch import nn fro…...

【正点原子K210连载】第三十二章 音频FFT实验 摘自【正点原子】DNK210使用指南-CanMV版指南

第三十二章 音频FFT实验 本章将介绍CanMV下FFT的应用,通过将时域采集到的音频数据通过FFT为频域。通过本章的学习,读者将学习到CanMV下控制FFT加速器进行FFT的使用。 本章分为如下几个小节: 32.1 maix.FFT模块介绍 32.2 硬件设计 32.3 程序设…...

Android Studio修改默认.m2与Gradle user home缓存位置

Android Studio修改默认.m2与Gradle user home缓存位置 1、修改Gradle user home的方法: android studio配置默认.gradle路径_android studio gradle在哪-CSDN博客文章浏览阅读2k次。当android studio新建一个项目时候,默认的.gradle路径均认为是在c盘的…...

BFS解决单源最短路问题

目录 迷宫中离入口最近的出口 最小基因变化 单词接龙 为高尔夫比赛砍树 迷宫中离入口最近的出口 题目 思路 使用宽度优先遍历解决这道题,需要一个二维数组标记是否被遍历过,也需要一个队列辅助完成宽度优先遍历,类似于水波纹一样&#x…...

Linux运维、Windows运维常用命令,保存起来当手册用

文章目录 一、centos基本命令1、升级内核到最新版本2、文件句柄数限制优化3、ssh、sftp、scp等远程命令4、find文件查找5、vi命令 二、windows常用操作 一、centos基本命令 1、升级内核到最新版本 # 1、查看内核版本 [rootlocalhost ~]# cat /etc/centos-release CentOS Linu…...

FTP协议-匿名用户登录 从0到1

前言 日常大家可能接触web漏洞比较多而对其他端口及协议不那么了解,其实其他协议漏洞在渗透中也同样重要只是平时可能接触得不多。本文将介绍FTP协议、FTP匿名用户登录及其具体流程分析和自动化利用demo。 FTP简介 FTP是File Transfer Protocol(文件传…...

【UltraVNC】私有远程工具VNC机器部署方式

旨在解决监控端非固定IP的计算机A,远程连接受控端非固定IP的计算机B。如果没有独立公网IP,是不能直接远程桌面的,所以需要一个服务器来中转双方的数据。 一、UltraVNC下载和安装 ----------免费开源远程控制工具——UltraVNC 官网:Home - UltraVNC VNC OFFICIAL SITE, R…...

五大无线领夹麦克风误区科普:领夹麦杂音干扰不耐用问题必须规避

在选购无线领夹麦克风的道路上,不少新手因经验不足,容易落入性能低下的产品陷阱。这些麦克风不仅信号不稳定,音质差强人意,甚至在使用一段时间后出现信号衰减、杂音加重等现象。这并非偶然,而是市场中充斥着大量品质参…...

适合金融行业的企业级跨网文件交换系统

在金融领域,文件交换平台的作用不可小觑,它关乎数据的保密性、稳定性,并且必须遵守严格的合规标准。那么,一个适合金融业跨网文件交换的系统应该具备哪些特质,又是如何满足这些需求的呢?镭速跨网文件交换系…...

vba发邮件的几种方法:新人如何快速上手?

vba发邮件的几种方法有哪些!vba自动化邮件发送技巧! 对于新人来说,快速掌握VBA发邮件的几种方法,不仅可以节省大量时间,还能提高工作质量。AokSend将详细介绍几种常见的VBA发邮件的方法,帮助新人快速上手&…...

豆瓣评分8.7!Python pandas创始人亲码的数据分析入门手册!

在众多解释型语言中,Python最大的特点是拥有一个巨大而活跃的科学计算社区。进入21世纪以来,在行业应用和学术研究中采用python进行科学计算的势头越来越猛。 近年来,由于Python有不断改良的库(主要是pandas),使其成为数据处理任…...

关于linux上root连接mysql时遇到的一点小问题以及rsync通过ssh的文件同步传输以及免密码传输的实现

一、关于linux上root连接mysql时遇到的一点小问题 今天因为工作需要,需要使用root连接一下很久没有连接过的mysql服务器了,一看找不到root密码了,记得当时我在搭建整个mysql主从的时候,我明明把root密码记录在了txt文件上的&#…...

一、Socket介绍(也叫套接字)

一、定义 通过IP地址或者端口 将两个电脑连接起来; Socket是网络通信最常用的,除了这个还有HTTP; Http是一个弱联网;Socket用于长连接,使用的是Tcp; 除了这个还有一个SuperSocket,是对Socket…...

虚拟现实技术的发展现状如何?

虚拟现实(VR)技术自2016年被广泛认为是元年之后,经历了快速增长和随后的调整期。目前,VR行业正处于快速发展期,技术不断进步,应用场景持续拓展。2024年VR技术发展现状概述: 1、行业发展阶段&am…...

实时美颜技术的实现:视频美颜SDK与直播美颜工具的最佳实践

视频美颜SDK与直播美颜工具的诞生,为主播美颜一需求提供了技术支撑。接下来,笔者将深入探讨实时美颜技术的实现及其在视频美颜SDK与直播美颜工具中的最佳实践。 一、实时美颜技术的核心原理 具体来说,主要包括以下几个步骤: 1.…...

Java中的司机抢单实现:并发问题与解决方案

文章目录 司机抢单的基础实现乐观锁解决并发问题 总结 在共享经济的浪潮中,像滴滴打车这样的服务已经成为我们生活中不可或缺的一部分。对于司机和平台来说,抢单是一个关键环节,如何在保证系统高效运行的同时,确保抢单过程的公平与…...

2、Unity【基础】Mono中的重要内容

Unity基础 MonoBehavior中的重要内容 文章目录 Mono中的重要内容1、延迟函数1、延迟函数概念2、延迟函数使用3、延迟函数受对象失活销毁影响思考1 利用延时函数实现计时器思考2 延时销毁 2、协同程序1、Unity是否支持多线程2、协同程序概念3、协同程序和线程的区别4、协程的使用…...

C++11:右值引用、移动语义和完美转发

目录 前言 1. 左值引用和右值引用 2. 引用范围 3. 左值引用的缺陷 4. 右值引用的作用 5. 右值引用的深入场景 6. 完美转发 总结 前言 C11作为一次重大的更新,引入了许多革命性的特性,其中之一便是右值引用和移动语义。本文将深入探讨其中引入的…...

【大模型部署及其应用 】RAG检索技术和生成模型的应用程序架构:RAG 使用 Meta AI 的 Llama 3

目录 RAG检索技术和生成模型的应用程序架构1. **基本概念**2. **工作原理**3. **RAG的优势**4. **常见应用场景**5. **RAG的挑战**6. **技术实现**参考RAG 使用 Meta AI 的 Llama 3亲自尝试运行主笔记本与文档应用聊天关键架构组件1. 自定义知识库2. 分块3. 嵌入模型4. 矢量数据…...

python 速成指南

第一节. 过程式 python python 的一个特点是不通过大括号 {} 来划定代码块,而是通过缩进。如果和 C/C++ 类比的话,就是在左括号的地方不要换行,然后用一个冒号 (:) 替代, C/C++ 大括号内部的东西,缩进一个 tab 或者几个空格都可以(但需要保持一致),比如: if (x <…...

多重示例详细说明Eureka原理实践

Eureka原理&#xff08;Eureka Principle&#xff09;是指在长时间的思考和积累之后&#xff0c;通过偶然的瞬间获得灵感或发现解决问题的方法的一种认知现象。这个过程通常包括三个主要阶段&#xff1a;准备阶段、潜伏期以及突然的灵感爆发。下面详细说明Eureka原理的实践步骤…...

Qt下让程序只运行一个实例,避免重复打开

参考 【实现QT单例程序 QSystemSemaphore QSharedMemory】 做了一点点更改&#xff0c;主要是在openEuler上用时遇到的一点问题。 QSharedMemory *unimem nullptr; void checkExist() {QString memName "SingleApp"; // 注意这名字要每个工程不一样&#xff0c;否…...

商城网站怎么做内链/百度竞价广告点击器

CSS 概述CSS 指层叠样式表 (Cascading Style Sheets)&#xff0c;用于定义如何显示 HTML 标签&#xff0c;进行美化页面&#xff0c;css通常存储在样式表中。css有三种存在方式标签内联、页面嵌入和外部引入&#xff0c;比较三种方式的优缺点。在标签中使用 stylexx:xxx; 在…...

新网网站模板/seo挂机赚钱

进程和线程的结束 在执行体层&#xff0c;线程的终止函数是NtTerminateThread,内部调用PspTerminateThreadByPointer完成终止处理。系统线程的终止函数是PsTerminateSystemThread,内部调用 PspTerminateThreadByPointer完成终止处理。 三个函数原型如下&#xff1a; NTSTAT…...

域名 空间 建网站/百度搜索量统计

判断两棵树是否相同方法&#xff1a;对两棵树同时做相同的递归判断其值或者是结构是否相同。以下代码用的是前序遍历。递归方法(毕竟递归好理解而且代码少得可怜)。比较啰嗦的是指针为空的情况&#xff0c;只要把这些情况单独列出来就可了。javapublic boolean isSame(TreeNode…...

自己做的网站发布详细步骤/南昌seo搜索排名

目前&#xff0c;Python有两个主要版本&#xff1a; 2.7、3.6&#xff0c;两个版本不兼容。2.7是工业版本&#xff0c;目前大量的生产环境都是这个版本&#xff0c;因为已经在线上运行&#xff0c;很多都没法再改。新的创业公司&#xff0c;一般都会有3.0。据Python官方宣布,20…...

wordpress共享文件/网络推广怎么做方案

案例&#xff1a;package ZhuanHuanLiu;import java.io.*;/*练习&#xff1a;转换文件编码将GBK编码的文本文件&#xff0c;转换为UTF-8编码的文本文件分析&#xff1a;1.创建InputStreamReader对象&#xff0c;构造方法中传递字节输入流和指定的编码表名称GBK2.创建OutputTrea…...

网站建设维护培训会上的讲话/seo网站排名优化工具

LoggerFactory.getLogger可以在IDE控制台打印日志&#xff0c;便于开发&#xff0c;一般加在最上面&#xff1a; 使用&#xff1a; //调试日志private final static Logger logger LoggerFactory.getLogger(xxxController.class);优点&#xff1a;使用指定类初始化日志对象&…...