Java面试_数据库篇_优化,事务,Mysql

news2024/11/26 21:37:46

Java面试_数据库篇_优化,事务,Mysql

  • 优化
    • 如何定位慢查询
      • 方案一: 开源工具
      • 方案二: Mysql自带慢日志
    • 如何分析慢SQL语句
    • 索引
      • 介绍索引
      • 聚簇索引和非聚簇索引,回表查询
      • 覆盖索引,超大分页优化
      • 索引创建的原则
      • 索引失效
    • 谈谈sql优化的经验
  • 事务
    • 事务特性
    • 隔离级别
    • undo log和redo log
    • MVCC
  • 主从同步原理
  • 分库分表
  • 来源

优化

如何定位慢查询

方案一: 开源工具

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

方案二: Mysql自带慢日志

在Mysql的配置文件(/etc/my.cnf)中配置:

# 开启MySQL慢日志查询开关
slow_query_log=1
# 设置慢日志的时间为2秒, SQL语句执行时间超过2秒, 就会视为慢查询, 记录慢查询日志
long_query_time=2

如何分析慢SQL语句

explain select * from ap_user where id = 1
在这里插入图片描述

  • possible_key: 当前sql可能会使用到的索引
  • key: 当前sql实际命中的索引
  • key_len: 索引占用的大小
  • Extra: 额外的优化建议
    Extra含义
    Using where; Using Index查找使用了索引, 需要的数据都在索引列中能找到, 不需要回表查询数据
    Using index condition查找使用了索引, 但是需要回表查询数据
  • type: 这条sql的连接类型, 性能从好到差
    • NULL: 没有使用表
    • system: 查询系统中的表
    • const: 根据主键查询
    • eq_ref: 主键索引查询或唯一索引查询
    • ref: 索引查询
    • range: 索引范围查询
    • index: 索引树扫描, 需要优化
    • all: 全盘扫描, 需要优化

使用MySQL自带的分析工具 EXPLAIN(DESC)

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

索引

介绍索引

  • 什么是索引
    • 索引(index)是帮助Mysql高效获取数据的数据结构(有序)
    • 提高数据检索的效率,降低数据库的IO成本(不需要全表扫描)
    • 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗
  • 索引的底层数据结构
    • Mysql的InnoDB引擎采用的B+树的数据结构来存储索引
    • 阶数更多,路径更短
    • 磁盘读写代价B+树更低,非叶子节点只存储指针,叶子节点存储数据
    • B+树便于扫库和区间查询,叶子节点间是双向链表

聚簇索引和非聚簇索引,回表查询

  • 聚簇索引(聚集索引):数据与索引放到一块,B+树的叶子节点保存了整行数据,有且只有一个
  • 非聚簇索引(二级索引):数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个
  • 回表查询:通过二级索引找到对应的主键值,到聚集索引中查找整行数据,这个过程就是回表
  • extend: 聚集索引选取规则
    • 如果存在主键,主键索引就是聚集索引
    • 如果不存在主键,将使用第一个唯一(UNIQUE)索引作为聚集索引
    • 如果表没有主键,或没有合适的唯一索引,则InnoDB会自动生成一个rowid作为隐藏的聚集索引

覆盖索引,超大分页优化

  • 什么是覆盖索引
    • 覆盖索引:指查询使用了索引,返回的列,必须在索引中全部能够找到
    • 如果返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select *
  • 超大分页优化
    • 当数据量比较大时,limit分页查询,需要对数据进行排序,效率低
    • 解决方案:覆盖索引+子查询

索引创建的原则

  • 数据量较大,且查询比较频繁的表(10w)
  • 常作为查询条件、排序、分组的字段
  • 尽量选择内容区分度高的字段,尽量使用唯一索引
  • 内容较长,使用前缀索引
  • 尽量使用联合索引,避免回表
  • 要控制索引的数量,加大增删改的成本
  • 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它,可以让优化器更好地选择索引

索引失效

  • 联合查询,违反最左前缀法则
  • 范围查询右边的列,不能使用索引
  • 不要在索引列上进行运算操作,索引将失效(substring)
  • 字符串不加单引号,造成索引失效(类型转换)
  • 以%开头的like模糊查询,索引失效

谈谈sql优化的经验

  • 表的设计优化
    • 设置合适的数值(tinyint int bigint), 根据实际情况选择
    • 设置合适的字符串类型(char varchar), char定长效率高, varchar可变长度, 效率稍低
  • SQL语句优化
    • select语句务必指明字段名称(避免直接使用 select *)
    • sql语句要避免造成索引失效的写法
    • 尽量用union all代替union,union会多一次过滤,效率低
    • 避免在where子句中对字段进行表达式操作
    • Join优化,能用inner join就不用left join,right join,如果需要使用则要以小表为驱动。内连接会对两个表进行优化,优先把小表放到外边,大表放到里边。left join或right join不会重新调整顺序。
  • 主从复制,读写分离,不让数据的写入影响都操作
  • 分库分表

事务

事务特性

  • 原子性(Atomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。
  • 一致性(Consistency):事务完成时,必须使所有的数据都保持一致状态。
  • 隔离性(Isolation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。
  • 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。
  • 参考回答
    在这里插入图片描述

隔离级别

  • 并发事务的问题
    在这里插入图片描述

  • 隔离级别
    在这里插入图片描述

  • 参考回答
    在这里插入图片描述

undo log和redo log

  • 缓冲池(buffer pool):主内存中的一个区域,里面可以换成磁盘上经常操作的真实数据,在执行增删改查操作时,先操作缓冲池中的数据(若缓冲池没有数据,则从磁盘加载并缓冲),以一定频率刷新到磁盘,从而减少磁盘io,加快处理速度。
  • 数据页(page):是InnoDB存储引擎磁盘管理的最小单元,每个页的大小默认为16KB。页中存储的是行数据。
  • redo log:记录的是数据页的物理变化,服务宕机可用来同步数据
  • undo log:记录的是逻辑日志,当事务回滚时,通过逆操作恢复原来的数据
  • redo log保证了事务的持久性,undo log保证了事务的原子性和一致性
  • 参考回答
    在这里插入图片描述

MVCC

MVCC是Mysql中的多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突。
实现原理如下:

  • 隐藏字段
    • trx_id(事务id),记录每一次操作的事务id,是自增的。
    • roll_pointer(回滚指针),指向上一个版本的事务版本记录地址。
  • undo log
    • 回滚日志,存储老版本数据
    • 版本链:多个事务并行操作某一行记录,记录不同事务修改数据的版本,通过roll_pointer指针形成一个链表。
  • readView解决的是一个事务查询选择版本的问题
    • 根据readView的匹配规则和当前的一些事务id判断该访问哪个版本的数据。
    • 不同的隔离级别快照读是不一样的,最终的访问的结果不一样
      • RC:每一次执行快照读时生成ReadView
      • RR:仅在事务中第一次执行快照读时生成ReadView,后续复用。

主从同步原理

在这里插入图片描述

分库分表

在数据量达到单表1000万或超过20G,就可以考虑分库分表

具体拆分策略如下:

  • 水平分库:将一个库的数据拆分到多个库中,解决海量数据存储和高并发的问题
  • 水平分表:解决单表存储和性能的问题
  • 垂直分库:根据业务进行拆分,高并发下提高磁盘IO和网络连接数
  • 垂直分表:冷热数据分离,多表互不影响。

来源

黑马程序员. 新版Java面试专题视频教程

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

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

相关文章

算法:位运算题目练习

目录 常见的位运算的操作总结 ①基础位操作 ②给一个数n,确定它的二进制表示中的第x位是0还是1 ③将一个数n的二进制表示的第x位修改成1 ④将一个数n的二进制表示的第x位修改成0 ⑤位图的思想 ⑥提取一个数n二进制表示中最右侧的1 ⑦干掉一个数n二进制表示中…

无人机、机器人10公里WiFi远距离图传模块,实时高清视频传输,飞睿CV5200模组方案,支持mesh自组网模块

在快速发展的物联网时代,远距离无线通信技术已成为连接各种智能设备的关键。无人机、安防监控、机器人等领域对数据传输的距离和速度要求越来越高。 公里级远距离WiFi模组方案可以通过多种技术和策略的结合来实现无人机和机器人之间的高效通信传输。 飞睿智能CV52…

QT C++ QTableWidget 表格合并 setSpan 简单例子

这里说的合并指的是单元格,不是表头。span的意思是跨度、宽度、范围。 setSpan函数需要设定行、列、行跨几格,列跨几格。 //函数原型如下 void QTableView::setSpan(int row, i nt column, 、 int rowSpanCount,/*行跨过的格数*/ int columnSpanCount…

离散数学答疑 5

知识点:单侧连通,强连通,弱连通 前缀码:比如001和00101就不是。因为后者的前三位和前者的重复了 有向图的邻接矩阵求法:横着看 数据结构21-4分钟搞定邻接矩阵_哔哩哔哩_bilibili 可达矩阵是包含自反性的。可达矩阵是…

Excel 将同一分类下的值依次填进分类格右边的格中

表格的第2列是分类,第3列是明细: ABC1S.noAccountProduct21AAAQatAAG32BAAQbIAAW43BAAQkJAAW54CAAQaAAP65DAAQaAAX76DAAQbAAX87DAAQcAAX 需要将同一分类下的值依次填入分类格右边的格中: ABCD1S.noAccountProduct21AAAQatAAG32BAAQbIAAWkJ…

13 RTP包的使用

RTP RTP包最主要的就是Sequence number。 对于发送者来说,视频的每一个帧都有很多包组成。对于接收端来接收的时候是有一个队列进行接收的。这个队列大小都是通过计算的。有了队列之后就会不断的往队列中插入数据。当队列中有的数据超时一直组不成包的时候&#xf…

国资e学快速学习实战教程

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

[FreeRTOS 基础知识] 任务调度 与 链表

文章目录 任务并行的概念RTOS如何实现多任务调度? 任务并行的概念 在生活中,经常出现一心多用的情况。比如你需要一边吃饭一边手机回复信息,这里面就存在两个任务:任务一、吃饭。任务二、手机回复信息。 假如你无法一心多用&…

IO进程线程(十二)进程间通信 共享内存 信号灯集

文章目录 一、共享内存 shared memory(shm)(一)特点(二) 相关API1. 创建共享内存2. 映射共享内存到当前的进程空间3. 取消地址映射4. 共享内存控制 (三)使用示例(四&…

08-指针与数组的结合——数组指针与指针数组的区别

指针与数组的结合 示例 1:指针访问数组元素 通过指针访问数组元素的例子&#xff1a; #include <stdio.h>int main() {int arr[5] {1,2,3,4,5};//int *p1 &arr;int *p1 (int *)&arr; // 需要强制类型转换int *p2 arr;printf("*p1:%d\n", *(p1 …

【SQL】牛客网SQL非技术入门40道代码|练习记录

跟着刷题&#xff1a;是橘长不是局长哦_哔哩哔哩_bilibili 6查询学校是北大的学生信息 select device_id, university from user_profile where university 北京大学 7查找年龄大于24岁的用户信息 select device_id, gender, age, university from user_profile where age…

大模型训练的艺术:从预训练到增强学习的四阶段之旅

文章目录 大模型训练的艺术&#xff1a;从预训练到增强学习的四阶段之旅1. 预训练阶段&#xff08;Pretraining&#xff09;2. 监督微调阶段&#xff08;Supervised Finetuning, SFT&#xff09;3. 奖励模型训练阶段&#xff08;Reward Modeling&#xff09;4. 增强学习微调阶段…

关于 Redis 中集群

哨兵机制中总结到&#xff0c;它并不能解决存储容量不够的问题&#xff0c;但是集群能。 广义的集群&#xff1a;只要有多个机器&#xff0c;构成了分布式系统&#xff0c;都可以称之为一个“集群”&#xff0c;例如主从结构中的哨兵模式。 狭义的集群&#xff1a;redis 提供的…

C++~~期末复习题目讲解---lijiajia版本

目录 1.类和对象 &#xff08;3&#xff09;创建对象的个数 &#xff08;3&#xff09;全局变量&#xff0c;局部变量 &#xff08;4&#xff09;构造函数的执行次数 &#xff08;5&#xff09;静态动态析构和构造顺序 &#xff08;6&#xff09;初始化顺序和声明顺序 &a…

Postman环境变量以及设置token全局变量!

前言百度百科解释&#xff1a; 环境变量&#xff08;environment variables&#xff09;一般是指在操作系统中用来指定操作系统运行环境的一些参数&#xff0c;如&#xff1a;临时文件夹位置和系统文件夹位置等。 环境变量是在操作系统中一个具有特定名字的对象&#xff0c;它…

【微服务】springcloud-alibaba 配置多环境管理使用详解

目录 一、前言 二、配置多环境问题概述 2.1 什么是微服务多环境配置管理 2.1.1 微服务多环境配置管理问题起源 2.2 为什么要做多环境配置管理 2.3 微服务多环境配置管理解决方案 三、springboot 配置多环境管理解决方案 3.1 前置准备 3.1.1 搭建一个springboot工程 3.…

第五十六周:文献阅读

目录 摘要 Abstract 文献阅读&#xff1a;应用于地表水总磷浓度预测的可解释CEEMDAN-FE-LSTM-Transformer混合模型 一、现有问题 二、提出方法 三、方法论 1、CEEMDAN&#xff08;带自适应噪声的完全包络经验模式分解&#xff09; 2、FE&#xff08;模糊熵 &#xff09…

k8s离线部署Calico网络(2续)

下载离线镜像 百度网盘 链接&#xff1a;https://pan.baidu.com/s/14ReJW-ZyYZFLbwSEBZK6mA?pwdi6ct 提取码&#xff1a;i6ct 1.将离线镜像上传至所有服务器并解压&#xff1a; [rootmaster ~]# tar xf calico.tar.gz [rootmaster ~]# cd calico 2.所有服务器使用for循环导入…

Python 基础语法详解(三)

Python 基础语法详解&#xff08;三&#xff09; Python 运算符Python 算术运算符①理论讲解&#xff1a;②实操讲解&#xff1a; Python 比较运算符①理论讲解&#xff1a;②实操讲解&#xff1a; Python 赋值运算符Python 位运算符①理论讲解&#xff1a;②实操讲解&#xff…

JVM学习-JVM运行时参数

JVM参数选项 标准参数选项 特点 稳定&#xff0c;后续版本不会变化以【-】开头 各种选项 运行java或者java -help可以看到所有的标准选项 补充内容 -server&#xff1a;64位机器上只支持Server模式的JVM&#xff0c;适用于需要大内存的应用程序&#xff0c;默认用并行垃圾回…