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

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面试专题视频教程

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

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

相关文章

vue-2 组件传值

组件关系分类 父子关系非父子关系 父子通信流程 父组件通过props将数据传递给子组件 给子组件以添加属性的方式传值子组件内部通过 props 接收模板中直接使用 props 接收的值 父组件 Parent.vue <template><div class"parent" style"border: 3px s…

力扣 T62 不同路径

题目 连接 思路 思路1 &#xff1a; BFS爆搜 class Solution { public:queue<pair<int,int>>q;int uniquePaths(int m, int n) {q.push({1,1}); // 起始位置vector<pair<int, int>> actions;actions.push_back({0, 1}); // 向下actions.push_bac…

论文中eps格式图片制作

在提交论文终稿时&#xff0c;有时需要提交论文中图片的eps格式&#xff0c;这里记录一下eps格式图片制作的过程&#xff0c;方便以后查阅。 论文中eps格式图片制作 PPT绘制的图片转换为eps格式使用代码生成的图片Latex中显示的图片大小跟Ai中设定画板的大小不一致 PPT绘制的图…

ABB机械人模型下载

可以下载不同格式的 https://new.abb.com/products/robotics/zh/robots/articulated-robots/irb-6700 step的打开各部件是分开的&#xff0c;没有装配在一起&#xff0c;打开看单个零件时&#xff0c;我们会发现其各零件是有装配的定位关系的。 新建一个装配环境&#xff0c;点…

ctfshow-web入门-命令执行(web53-web55)

目录 1、web53 2、web54 3、web55 1、web53 这里的代码有点不一样&#xff0c;说一下这两种的区别&#xff1a; &#xff08;1&#xff09;直接执行 system($c); system($c);这种方式会直接执行命令 $c 并将命令的输出直接发送到标准输出&#xff08;通常是浏览器&#xff…

基于机器学习和深度学习的NASA涡扇发动机剩余使用寿命预测(C-MAPSS数据集,Python代码,ipynb 文件)

以美国航空航天局提供的航空涡扇发动机退化数据集为研究对象&#xff0c;该数据集包含多台发动机从启动到失效期间多个运行周期的多源传感器时序状态监测数据&#xff0c;它们共同表征了发动机的性能退化情况。为减小计算成本&#xff0c;需要对原始多源传感器监测数据进行数据…

软件测试--Mysql快速入门

文章目录 软件测试-mysql快速入门sql主要划分mysql常用的数据类型sql基本操作常用字段的约束&#xff1a;连接查询mysql内置函数存储过程视图事务索引 软件测试-mysql快速入门 sql主要划分 sql语言主要分为&#xff1a; DQL&#xff1a;数据查询语言&#xff0c;用于对数据进…

SpringBoot中实现一个通用Excel导出功能

SpringBoot中实现一个通用Excel导出功能 文章目录 SpringBoot中实现一个通用Excel导出功能这个导出功能的特色看效果代码解析1、依赖2、Excel 入参(ExcelExportRequest)3、Excel 出参(ExcelExportResponse)4、ExcelExportField5、ExcelExportUtils 工具类6、ExcelHead 头部…

鸿蒙开发接口安全:【@ohos.userIAM.userAuth (用户认证)】

用户认证 说明&#xff1a; 本模块首批接口从API version 6开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import userIAM_userAuth from ohos.userIAM.userAuth;完整示例 // API version 6 import userIAM_userAuth from ohos.use…

AI全栈工程师的新舞台:Coze(扣子)

前言 在当前科技飞速发展的背景下&#xff0c;Coze作为一款引领潮流的AI应用平台&#xff0c;正以破竹之势重塑着我们对于智能应用的认知。Coze不仅仅是一个工具&#xff0c;它是一个集合了前沿AI技术、高效开发环境与创意无限的应用生态于一体的创新平台&#xff0c;旨在让每…

RabbitMQ-工作模式(Topics模式RPC模式Publisher Confirms模式)

文章目录 Topics模式topic代码示例 RPC模式客户端界面回调队列关联ID总结RPC代码示例 Publisher Confirms模式概述在通道上启用发布者确认单独发布消息批量发布消息异步处理发布者确认总结总体代码示例 更多相关内容可查看 Topics模式 在Topics中&#xff0c;发送的消息不能具…

QT 信号和槽 信号关联到信号示例 信号除了可以绑定槽以外,信号还可以绑定信号

信号除了可以关联到槽函数&#xff0c;还可以关联到类型匹配的信号&#xff0c;实现信号的接力触发。上个示例中因为 clicked 信号没有参数&#xff0c;而 SendMsg 信号有参数&#xff0c;所以不方便直接关联。本小节示范一个信号到信号的关联&#xff0c;将按钮的 clicked 信号…

---java 抽象类 和 接口---

抽象类 再面向对对象的语言中&#xff0c;所以的对象都是通过类来描述的&#xff0c;但如果这个类无法准确的描述对象的 话&#xff0c;那么就可以把这个类设置为抽象类。 实例 这里用到abstract修饰&#xff0c;表示这个类或方法是抽象方法 因为会重写motifs里的show方法…

【已解决】FileNotFoundError: [Errno 3] No such file or directory: ‘xxx‘

&#x1f60e; 作者介绍&#xff1a;我是程序员行者孙&#xff0c;一个热爱分享技术的制能工人。计算机本硕&#xff0c;人工制能研究生。公众号&#xff1a;AI Sun&#xff0c;视频号&#xff1a;AI-行者Sun &#x1f388; 本文专栏&#xff1a;本文收录于《AI实战中的各种bug…

游戏服务器工程实践一:百万级同时在线的全区全服游戏

我应该有资格写这篇文章&#xff0c;因为亲手设计过可以支撑百万级同时在线的全区全服类型的游戏服务器架构。 若干年前我在某公司任职时&#xff0c;参与研发过一款休闲类型的游戏&#xff0c;由 penguin 厂独代。研发的时候&#xff0c;p 厂要求我们的游戏服务器要能支撑百万…

如何自我认同?是否需要执着于社会性认同?

一、自我认同与社会性认同 自我认同与社会性认同是两个相关但又有所区别的概念&#xff0c;它们分别反映了个体在内心深处对自身价值的认知&#xff0c;以及外界&#xff08;尤其是社会&#xff09;对个体价值的评价与接纳。 自我认同 自我认同是指个体基于自身的价值观、能…

【C语言】青蛙跳台阶问题 - 递归算法(一种思路,针对三种不同的情况)

文章目录 1. 前言2. 题目和分析2.1 代码实现2.2 反思 (重点) 3.题目二&#xff08;变式&#xff09;3.1 分析3.2 代码实现 4. 题目三&#xff08;变式&#xff09;4.1 分析4.2 代码实现 1. 前言 相信大家看到青蛙跳台阶问题时&#xff0c;第一时间就会想到递归。那你知道为什么…

暴雨推出X705显示器:23.8英寸100Hz IPS屏

IT资讯 6月 7 日消息&#xff0c;日前&#xff0c;暴雨发布了一款 23.8 英寸 IPS 显示器&#xff0c;直屏、支持 100Hz 刷新率。 据官方介绍&#xff0c;X705 显示器分辨率为 19201080&#xff0c;亮度为 300 尼特&#xff08;典型值&#xff09;&#xff0c;对比度 1000:1&…

Junit(Java单元测试)

目录 配置文件 注解 Test 标注测试方法 BeforeAll 和 AfterAll 标注在测试之前和之后执行的方法 BeforeEach 和 AfterEach 标注在每条测试之前和之后执行的方法 TestMethodOrder 和 Order(优先级) 标注测试方法的执行顺序 ParameterizedTest 将测试方法参数化 ValueSou…

【Activiti7系列】基于Spring Security的Activiti7工作流管理系统简介及实现(附源码)(下篇)

作者&#xff1a;后端小肥肠 上篇&#xff1a;【Activiti7系列】基于Spring Security的Activiti7工作流管理系统简介及实现&#xff08;上篇&#xff09;_spring security activiti7-CSDN博客 目录 1.前言 2. 核心代码 2.1. 流程定义模型管理 2.1.1. 新增流程定义模型数据 …