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执行计划分析,进行优化。使用MySQL自带命令 explain 或 desc :

EXPLAIN/DESC + 原SQL语句

fb4d80ce6a8946b5b95f7756fbf9e66f.png

6d2fea07efe04d81b2e7bb1e89b27d30.png

字段含义

  • 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。

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


二、MySQL存储引擎

1、分类

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

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

在mysql中提供了很多的存储引擎,比较常见有InnoDB、MyISAM、Memory

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

2、体系结构

78392596c157435f86d5e7c45570ecbe.png


三、索引

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

1、B树

358336667f874628abed914921ebf747.png

2、B+树

8eee346b63da4248ba17f5083c18d181.png

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的时候走的是覆盖索引,所以效率会提升。

5、创建索引的原则

依次考虑:主键索引、唯一索引、复合索引(根据业务情况创建);

原则:

  • 数据量较大,且查询比较频繁的表创建索引;(例,>10万条)
  • 针对查询条件 where 、排序 sort by 、分组 group by 等操作的字段创建索引;
  • 选择区分度高的字段作为索引,优先创建唯一索引,检索效率高;
  • 字符串类型的字段,如果长度较长,可以考虑创建前缀索引;(取字段的前一部分)
  • 涉及多字段作为查询条件的情况,尽量使用联合索引,减少单列索引。联合索引很多时候可以覆盖索引,可以避免回表,节省存储空间;
  • 需要控制索引的数量,索引数量越多,维护索引的代价也越大,同时影响增删改的效率;
  • 如果某个字段不能存储NULL值,建表语句对应该字段应当使用 NOT NULL 约束。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询。

6、索引失效的情况

(1)判断索引是否失效

explain 命令,例:

假设我们在student表中有一个联合索引“idx_age_name_grade (name,age,  grade)”

explain select  *  from student where name = "zhangsan" and age = 20 and grade = 3;
explain select  *  from student where name = "zhangsan" grade = 3;
explain select  *  from student where age = 20 and grade = 3;

可以通过对比上述语句的输出内容,key 、 key_len ...,查看索引的使用情况。

(2)失效的场景

  • 使用聚合索引,违反最前左缀原则(如,上述student表,查询条件无name且包括age或grade的情况);
  • 联合索引,查询语句使用了范围查询,右边的列索引不会生效(如,select * from student where name = "zhangsan" and age > 20 and grade = 3;范围查询“age > 20” 右侧的 grade 字段索引不生效 );
  • 在索引列上进行了运算,索引会失效;
  • 字符串对应的字段查询语句不加引号,出现类型转换,引起失效;
  • like查询,以 % 开头的模糊查询(如果仅仅是以 % 结尾的 like 查询,索引不会失效);
  • or 前后没有同时使用索引;
  • 索引字段使用了 IS NULL 、IS NOT NULL、not、!= 等;
  • mysql评估全表扫描比使用索引查询快

注意:联合索引的情况,如果只是查询条件里的查询顺序和索引定义的顺序不同,不影响走索引。索引优化器会对查询条件进行优化,即进行重新排序。

7、SQL优化总述

涉及方面:

  • 表的设计优化
    • 选用合适的字段类型
  • SQL语句优化 && 索引优化:关联 “5、索引创建原则”、“6、索引失效情况”
    • 尽量避免使用 select *,防回表
    • Join优化:能用innerjoin 就不用left join right join,如必须使用 一定要以小表为驱动。内连接会对两个表进行优化,优先把小表放到外边,把大表放到里边。left join 或 right join,不会重新调整顺序。
  • 主从复制、读写分离
  • 分库分表

(1)主从复制

(2)分库分表


四、事务

事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。

1、事务的特性ACID

  • 原子性 Automaticity:事务是不可分割的工作单位,要么全部成功,要么全部失败;
  • 一致性 Consistency:事务将数据库从一种状态转变为下一种一致的状态;
  • 隔离性 Isolation:不受并发操作的影响,事务提交前对其他事务不可见;
  • 持久性 Durability:事务一旦提交,其结果就是永久性的。即使发生宕机等故障,数据库也能将数据恢复。

例:A向B操作转账100元,

原子性:A扣除100,B增加100,要么都成功要么都失败;

一致性:数据在事务执行前后一致(转账前后),A扣除了100,B必须增加100;

隔离性:A向B转账,不受其他事务的影响;

持久性:事务提价后,需要将数据持久化(落盘操作)。

2、并发问题

脏读、不可重复读、幻读

  • 脏读:一个事务读取了另一个事务还没有提交的内容;
  • 不可重复读:一个事务,前后读取同一条记录,获取到的数据内容不同(原因是查询的过程中其他事务做了更新操作);
  • 幻读:一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了”幻影”(原因是查询过程中其他事务做了添加操作)。

3、事务隔离级别

解决并发事务问题的方案:对事务进行隔离。

(1)四种隔离级别

1)READ UNCOMMITTED(读未提交)

事务中最低的级别,该级别下的事务可以读取到另一个事务中未提交的数据,也被称为脏读( Dirty Read)。

2)READ COMMITTED(读提交)

大多数数据库管理系统的默认隔离级别,例如Oracle。

该级别下,事务只能读其他事务已经提交的内容,可以避免脏读,但不能避免重复读、幻读的情况。

3)REPEATABLE READ(可重复读)

MySQL默认的事务隔离级别,可以避免脏读、不可重复读的问题,确保同一个事务的多个实例在开发并发读取数据时,会看到同样的数据行。该级别在理论上会出现幻读的情况,但MySQL的存储引擎通过多版本并发控制(MVCC)解决了该问题

4)SERIALIZABLE(串行化)

事务的最高隔离级别,强制对事务进行排序,使事务之间不会发生冲突,从而解决脏读、幻读、重复读的问题。

(2)各隔离级别可能出现的问题

4、undo log && redo log

5、MVCC


参考内容:

B站视频课程:https://www.bilibili.com/video/BV1yT411H7YK

掘金:https://juejin.cn/post/6985026799163932708

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

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

相关文章

云原生技术峰会:引领智能算力时代的创新浪潮

云原生技术峰会:引领智能算力时代的创新浪潮 随着云计算技术的飞速发展和智能算力的不断提升,云原生架构已成为推动企业数字化转型的重要力量。一场汇聚了业界顶尖专家和学者的云原生技术峰会成功举行,与会者共同探讨了云原生在智能算力时代…

python3用两个栈实现一个队列

栈与队列 栈:先入后出,First In First Out (FIFO) ,类似桶(入到桶底、取从桶顶) 队列:先入先出,First In Last Out (FILO) 用两个栈实现一个队列 两个桶(栈)&#x…

Shell 编程入门

优质博文:IT-BLOG-CN 【1】x.sh文件内容编写: 固定开头:#!/bin/sh; 【2】学习的第一个命令就是echo输出的意思; 【3】其实shell脚本也就是在文件中写命令,但是我们要写的是绝对路径&#xff1a…

Web渗透:逻辑越权漏洞

逻辑越权漏洞(Business Logic Vulnerability)是指攻击者利用应用程序业务逻辑中的漏洞,绕过正常的安全控制,执行未授权的操作。与常见的技术性漏洞不同,逻辑越权漏洞通常与应用程序的功能和流程有关,需要对…

Java初识集合(后续不断补充)

第一次更新时间:2024.6.26 集合概述 Java中的集合就像一个容器,专门用来存储Java对象(实际上是对象的引用,但习惯称为对象),这些对象可以是任意的数据类型,并且长度可变。其中,这些…

使用go语言来完成复杂excel表的导出导入

使用go语言来完成复杂excel表的导出导入(一) 1.复杂表的导入 开发需求是需要在功能页面上开发一个excel文件的导入导出功能,这里的复杂指定是表内数据夹杂着一对多,多对一的形式,如下图所示。数据杂乱而且对应不统一。…

基于单片机和 Arduino 平台的六自由度可控机械手臂

摘 要 : 为了降低机械手臂的设计开发难度 , 并使之尽早地投入应用 , 设计一种基于单片机和 Arduino 平台的六自由度可控机械手臂 。提出六自由度可控机械手臂的控制方案, 给出机械手臂控制系统的结构框图 。 详细设计六自由度可控机械手臂…

1991java Web体检预约管理系统eclipse定制开发mysql数据库BS模式java编程jdbc

一、源码特点 JSP体检预约管理系统是一套完善的web设计系统,对理解JSP java 编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,eclipse开发,数据库为Mysql5.0,使用…

2024华为数通HCIP-datacom最新题库(变题更新⑤)

请注意,华为HCIP-Datacom考试831已变题 请注意,华为HCIP-Datacom考试831已变题 请注意,华为HCIP-Datacom考试831已变题 近期打算考HCIP的朋友注意了,如果你准备去考试,还是用的之前的题库,切记暂缓。 1、…

MATLAB-遗传GA-CNN-SVM,基于GA遗传优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类)

MATLAB-遗传GA-CNN-SVM,基于GA遗传优化算法优化卷积神经网络CNN结合支持向量机SVM数据分类(多特征输入多分类) 1.数据均为Excel数据,直接替换数据就可以运行程序。 2.所有程序都经过验证,保证程序可以运行。 3.具有良好的编程习惯&#xf…

linux centos rabbitmq3.7.5 一键安装部署

linux centos rabbitmq3.7.5 一键安装部署 一、基础理论二、kafka和rocketmq、rabbitmq的区别三、下载所需安装包四、一键安装 一、基础理论 RabbitMQ是一个实现了高级消息队列协议(AMQP)的开源消息代理软件,其作用主要体现在以下几个方面&a…

Docker 查看源地址/仓库地址,更改

一、源地址文件配置路径。若有docker文件夹,没有json,可以新增,复制进去内容 /etc/docker/daemon.json {"registry-mirrors": ["https://dockerhub.azk8s.cn","https://hub-mirror.c.163.com",&q…

“北京到底有谁在啊”影视APP开发,解锁最简单的快乐

随着电视剧《玫瑰的故事》在腾讯视频APP热播,APP也增加了很多热度,一款丰富的影视APP,无论是热门大片、经典影视剧、还是最新综艺节目,能畅享无限精彩的影视内容! 开发影视APP,需要专业的技术服务商来解决…

k8s手撕架构图+详解

“如果您在解决类似问题时也遇到了困难,希望我的经验分享对您有所帮助。如果您有任何疑问或者想分享您的经历,欢迎在评论区留言,我们可以一起探讨解决方案。祝您在编程路上顺利前行,不断突破技术的难关,感谢您的阅读&a…

使用nvm切换node版本时报错:exit status 1解决办法

作者介绍:计算机专业研究生,现企业打工人,从事Java全栈开发 主要内容:技术学习笔记、Java实战项目、项目问题解决记录、AI、简历模板、简历指导、技术交流、论文交流(SCI论文两篇) 上点关注下点赞 生活越过…

项目开发 TCP-Socket连接功能实现(Android端)

前段时间在公司做项目的时候遇到了一个功能需要使用TCP-Socket连接硬件设备进行通信,查了很多资料也只是关于HTTP-Socket相关的,没法满足项目的要求,后来查到一个相关的插件,现在有时间和大家分享一下。 项目简单介绍&#xff1a…

基于STM32+华为云IOT设计的智能冰箱(华为云IOT)

文章目录 一、前言1.1 项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成【4】摘要 1.2 设计思路1.3 系统功能总结1.4 开发工具的选择【1】设备端开发【2】上位机开发 二、部署华为云物联网平台2.1 物联网平台介绍2.2 开通物联网服务2.3 创建产品&#xff08…

Stateflow快速入门系列(-):构造并运行 Stateflow 图

Stateflow 提供了一种图形语言,包括状态转移图、流程图、状态转移表和真值表。您可以使用 Stateflow 来说明 MATLAB 算法和 Simulink 模型如何响应输入信号、事件和基于时间的条件。 Stateflow 使您能够设计和开发监控、任务调度、故障管理、通信协议、用户界面和混…

Windows USB设备驱动开发 - 常见概念的解释

我们听到许多 USB 术语几乎交替抛出。 它们都是什么意思?假设我们看到类似 “多亏了 USB 3.0,我可以将 SuperSpeed U 盘连接到电脑的 xHCI 主机控制器,并更快地复制文件。” 让我们了解该句子中的 USB 术语。 USB 3.0、USB 2.0 和 USB 1.0 请…

大模型笔记1: Longformer环境配置

论文: https://arxiv.org/abs/2004.05150 首先保证电脑上配置了git. git环境配置: https://blog.csdn.net/Andone_hsx/article/details/87937329 3.1、找到git安装路径中bin的位置,如:D:\Program Files\Git\bin 找到git安装路径中git-core的…