Java技术栈总结:数据库MySQL篇

一、慢查询

1、常见情形

聚合查询

多表查询

表数据量过大查询

深度分页查询

2、定位慢查询

方案一、开源工具

  • 调试工具:Arthas
  • 运维工具:Prometheus、Skywalking

方案二、MySQL自带慢日志

在MySQL配置文件 /etc/my.conf 中配置:

# 开启MySQL慢日志开关
slow_query_log=ON 
# 设置慢日志时间2秒,超过2秒的SQL语句会被认为是慢查询,记录慢查询日志 
long_query_time=2 
# 慢日志记录文件 
slow_query_log_file =/var/lib/mysql/localhost-slow.log

重启MySQL服务器,后续可在对应日志文件中查看慢日志信息。

3、慢SQL优化

  • 聚合查询,考虑增加临时表
  • 多表查询,优化SQL语句
  • 表数据量过大,增加索引
  • 深度分页查询,

其中,聚合查询、多表查询、数据量过大的情况,均可以使用SQL执行计划分析,进行优化。 

EXPLAIN/DESC + 原SQL语句

字段含义

  • possible_key,当前SQL可能会使用到的索引;
  • key,当前SQL实际命中的索引;
  • key_len,索引"key"占用空间大小;
  • Extra,额外的优化建议;
    • Using where;Using index:使用了索引,需要的数据在索引中都能够找到,不需要回表查询。
    • Using index condition:使用了索引,但是需要回表查数据。
  • type,该SQL数据访问/操作的类型,性能从好到差依次为:NULL、system、const、eq_ref、ref、range、index、all。
    • ALL,扫描全部数据,MySQL将遍历全表以找到匹配的行;
    • index,遍历索引,索引树扫描;
    • range,索引范围查找;
    • ref,使用非唯一索引查找数据;
    • eq_ref,类似ref,区别是使用的索引为唯一索引,对于每个索引的键值,表中只有一条记录匹配。
    • const,根据主键查询;
    • system,查询mysql自带的表;

Q:某条SQL查询很慢,如何分析?

A:可以使用MySQL自带分析工具EXPLAIN。

  • 通过keykey_len检查是否命中了索引(索引本身存在是否有失效的情况)
  • 通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描或全盘扫描
  • 通过extra建议判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复

二、MySQL存储引擎

1、分类

存储引擎是存储数据、建立索引、更新/查询数据等技术的实现方式。存储引擎基于表,而非基于数据库。

# 特性MyISAMInnoDBMEMORY
事务××
锁机制表锁表锁、行锁表锁
外键××

mysql中提供了很多的存储引擎,比较常见有InnoDBMyISAMMemory

  • InnoDB存储引擎是mysql5.5之后是默认的引擎,它支持事务、外键、表级锁和行级锁
    • DML操作遵循ACID模型,支持事务;
    • 行级锁,提高并发性能;
    • 支持外键,FOREIGN KEY 约束,保证数据的完整及正确性。
  • MyISAM是早期的引擎,不支持事务、只有表级锁、也没有外键,用的不多
  • Memory主要把数据存储在内存,支持表级锁,没有外键和事务,用的也不多

2、体系结构

三、索引

索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构(B+),这些数据结构以某种方式指向数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

1、B树

2、B+树

MySQL的InnoDB引擎采用的B+树的数据结构来存储索引

  • 阶数更多,路径更短
  • 磁盘读写代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据
  • B+树便于扫库和区间查询,叶子节点是一个双向链表(叶子节点内部为单向链表)。

B树与B+树对比:

①:磁盘读写代价B+树更低;②:查询效率B+树更加稳定;③:B+树便于扫库和区间查询

3、聚簇索引与非聚簇索引

聚簇索引,数据存储和索引在一块,索引结构的叶子节点保存了行数据。聚簇索引在每张表中都有且仅有一个。

非聚簇索引(二级索引),将数据与索引分开存储,叶子节点关联的内容为对应的主键。一张表可以有多个二级索引。

聚集索引选取规则:

  • 如果存在主键,主键索引就是聚集索引。
  • 如果不存在主键,将使用第一个唯一索引UNIQUE)作为聚集索引。
  • 如果表没有主键,且没有合适的唯一索引,则InnoDB自动生成一个rowid作为隐藏的聚集索引。

回表查询:通过二级索引找到对应的主键,然后根据主键值通过聚簇索引找到对应的行数据,这个查找的过程称为回表。

4、覆盖索引

覆盖索引:指查询使用了索引,并且需要返回的列,在该索引中已经全部能够找到 。

  • 使用id查询,直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。
  • 如果返回的列中没有创建索引,可能会触发回表查询,尽量避免使用 select *

# 超大分页问题处理,

数据量较大的情况,使用 limit 分页查询,查询越靠后,查询效率越低。

优化思路:一般分页查询时,通过创建 覆盖索引 能够比较好地提高性能,可以通过 覆盖索引 + 子查询 的形式进行优化。

select * from tb_sku t,(select id from tb_sku order by id limit 90000,10) a 
where t.id = a.id;

Q:超大分页怎么处理?

A:超大分页一般在数据量较大时,使用了limit分页查询,且需要对数据进行排序。这种情况下查询的效率就会比较低,可以采用覆盖索引和子查询解决。

首先,分页查询数据的主键id字段,然后用子查询来过滤,只需要查询这个id列表中的数据即可。因为查询id的时候走的是覆盖索引,所以效率会提升。

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

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

相关文章

C++01

本专栏记录重读《C primer》的一些随笔&#xff0c;随便写写..... /*标准库的头文件使用<> &#xff0c;非标准库的头文件使用""。申明写在.h文件&#xff0c;定义实现写在.cpp文件 */ #include<iostream> using namespace std; int main() {int v1;st…

Javascript高级程序设计(第四版)--学习记录之集合引用类型(上)

Object 显示的创建Object的实例方法&#xff1a; new操作符和Object构造函数 let person new Object(); person.name Jason; person.age 42 对象字面量 let person { name:Jason, age:42} 存取属性的方法一般有两种&#xff1a;点语法和中括号。 let person { name:Jason,…

智能制造装备业项目数字化管理之多项目管理

在智能制造装备业中&#xff0c;多项目管理已经成为行业发展的核心驱动力。这种管理方式从全局的视角出发&#xff0c;对企业内同时推进的多个项目进行精细化的全生命周期管控。这不仅仅涉及单一项目的管理&#xff0c;还包括项目集和项目组合管理。 根据客户需求&#xff0c;一…

怎么区分Boombap 制作Boombap曲子教学 boombap音乐出现的时间

Boombap音乐作为嘻哈音乐文化的重要组成部分&#xff0c;具有独特的音乐节奏、样式和情感。要理解和区分Boombap音乐&#xff0c;需要从其音乐的历史渊源、音乐特征和文化影响入手。接下来给大家介绍怎么区分Boombap&#xff0c;制作Boombap曲子教学的具体内容。 一、怎么区分B…

c语言常用易错记录

c语言常用易错记录 文章目录 c语言常用易错记录1.for循环 1.for循环 示例&#xff1a; #include <stdio.h>int main() {int i;for (i 0; i < 10; i) {printf("%d\n", i);}return 0; }执行顺序 备注&#xff1a;此图来源于b站鹏哥C语言视频课截图&#xf…

python异常处理2

异常堆栈跟踪 有时需要知道更多异常信息时&#xff0c;可以打印堆栈跟踪信息。堆栈跟踪信息可以通过python内置模块 traceback 提供的 print_exc() 函数实现&#xff0c;print_exc() 函数的语法格式如下&#xff1a; traceback.print_exc(limit None, file None,chain Tru…

mailbox驱动框架设计

文章目录 mailbox 驱动设计一、mailbox控制器/client驱动设计二、编译实例三、测试总结 mailbox 驱动设计 Mailbox&#xff08;邮箱&#xff09;是一种在多核系统中用于处理器间通信的机制。它允许不同的核心或处理器之间发送和接收消息&#xff0c;通常用于协调任务、同步状态…

【学一点儿前端】iOS微信小程序在密码input框中使用系统保存的密码后,密码v-model绑定值不更新的问题

碰到问题 又双叕碰到阴间bug&#xff0c;这回碰到了一生之敌iOS产生的兼容性问题 在iOS11中&#xff0c;支持密码的快速填充。这让iOS用户在微信小程序进行登录的时候&#xff0c;可以把当前账号密码保存进系统密码箱&#xff0c;之后再次登录时&#xff0c;输入账号后点击密码…

【软件工程】【22.04】p2

关键字&#xff1a; 软件开发分本质及涉及问题、需求规约与项目需求不同、用况图概念包含模型元素及其关系、创建系统的用况模型RUP进行活动、软件生存周期&软件生存周期模型&软件项目过程管理关系、CMMI基本思想 模块结构图&#xff1a;作用域、控制域&#xff1b;语…

【Linux命令】top linux下的任务管理器

一、概述 top命令是Linux下常用的性能分析工具&#xff0c;能够实时显示系统中各个进程的资源占用状况&#xff0c;类似于Windows的任务管理器。top是一个动态显示过程&#xff0c;即可以通过用户按键来不断刷新当前状态。如果在前台执行该命令&#xff0c;它将独占前台&#…

kafka 和Zookeeper 集群架构设计对比分析

kafka 和Zookeeper 集群架构设计对比分析 Kafka 和 Zookeeper 是两个关键的分布式系统组件,它们在集群架构设计上有显著的差异。 下面是对它们在集群架构设计方面的对比分析。 1. Kafka 集群架构设计 1.1 基本架构 Kafka 是一个分布式消息系统,由多个 Broker 组成。每个 …

rust 引用了Trait的实现,为什么还需要引入Trait 才能调用实现的方法

文章目录 1. Rust中结构体实现trait与方法调用的关系2. 要调用trait方法,有几种方式:3. code 1. Rust中结构体实现trait与方法调用的关系 在Rust中,当一个结构体实现了某个trait时,不能直接通过结构体调用trait中定义的方法。这是因为: trait方法不是结构体的固有方法。它们是…

文献阅读(307)AccelWattch

题目&#xff1a;AccelWattch: A Power Modeling Framework for Modern GPUs时间&#xff1a;2021会议&#xff1a;MICRO研究机构&#xff1a;西北大学 本篇论文的主要贡献&#xff1a; 提出了一个GPU功耗模型&#xff0c;考虑了DVFS, thread divergence, intra-warp function…

关于PHP中删除JSON指定元素unset和array_splice的区别

1. unset(mixed $var, mixed ...$vars): void unset 不会改变原有索引顺序 ------------------------- 2. array_splice( array &$array, int $offset, ?int $length null, mixed $replacement [] ): array array_splice 删除后&#xff0c;会重新排序…

小程序人脸分析

公司的业务需求是用户在使用某个功能前&#xff0c;必须使用人脸识别&#xff0c;确保当前使用人是用户本人&#xff0c;防止某些功能乱用。后端用的是腾讯的人脸识别方案&#xff0c;这里只是前端的识别代码&#xff0c;保证人脸剧中&#xff0c;大小合适&#xff0c;有一个人…

四十二、 我国粤港澳大湾区个人信息出境标准合同如何签署和备?

《大湾区标准合同》是注册于&#xff08;适用于组织&#xff09;/位于&#xff08;适用于个人&#xff09;粤港澳大湾区内地部分&#xff0c;或者香港特别行政区的个人信息处理者&#xff08;就内地而言&#xff0c;是指在个人信息处理活动中自主决定处理目的、处理方式的组织、…

4418 HMI 更换logo 图片

逻辑说明&#xff1a; HMI 的 kernel 没有提供源码&#xff0c;只是提供了镜像&#xff0c;如果客户需要更换自己的logo 的话&#xff0c; 可以使用提供的工具&#xff0c;将内核logo 打包起来。 我觉得这里的打包的过程应该是参考了&#xff0c; 4418 build_android.sh 脚…

自然语言处理课程论文

目录 1.背景介绍 1.1 文献介绍 1.2 研究背景 1.3 知识概述 1.3.1 机器翻译 1.3.2 attention机制与self-attention机制 2.数据来源与处理 2.1 数据集描述 2.2 数据处理 3. 模型架构 ​​​​​​​3.1 Positional Embedding ​​​​​​​3.2 Multi-Head Attention ​​​​​…

Go interface{}类型转换

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

华为HCIP Datacom H12-821 卷13

1.多选题 以下关于二层漫游和三层漫游的描述,以下说法正确的是? A、如果 STA 漫游时前后关联的 VLAN ID 相同则一定属于二层漫游 B、二层漫游是指客户端在同一子网内漫游 C、三层漫游是指客户端在不同子网间漫游 D、三层漫游前后 STA 关联的 AP 服务集上的 VL AN 必须相…