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

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

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

相关文章

system 和 exec 的区别

在 linux 中,使用 system 和 exec 都可以执行一个程序或者执行一个命令。两者的区别如下: system 中创建了一个子进程,在子进程中执行用户的命令,子进程执行完毕之后,system 会返回。exec 不会创建子进程,…

跟着大佬学RE(六)

findKey 嗯,就是一个窗口程序,没有输入,flag 应该就藏在程序里面 第一遍自己直接莽做,在string窗口,找到 flag{} 看到标红直接 nop 然后,然后就不知道怎么搞了 这串字符提示不能随便 nop ,重新…

虚幻引擎5 Gameplay框架(五)

Gameplay重要类及重要功能使用方法(四) DeveloperSetting DeveloperSetting是在虚幻引擎中是一个基类,主要用于创建和管理开发者设置相关的类。这类设置允许开发者自定义或调整项目中的各种配置选项,而无需直接修改代码或构建设置…

大模型应用开发框架LangChain

LangChain是什么? 它是针对大语言模型开发的一个开源的抽象框架。下图以github的流行度为例,可以看到langchain在很短的时间流行度达到Pytorch框架的高度,在AI燤火的当下,非常的流行。 上图,可以看到短短不到1年&…

AMD在行动:揭示应用程序跟踪和性能分析的力量

AMD in Action: Unveiling the Power of Application Tracing and Profiling — ROCm Blogs 导言 Rocprof是一款强大的工具,设计用于分析和优化基于AMD ROCm平台上运行的HIP程序的性能,帮助开发者找出并解决性能瓶颈。Rocprof提供了多种性能数据&#x…

每日一题——Python实现PAT乙级1099 性感素数(举一反三+思想解读+逐步优化)

一个认为一切根源都是“自己不够强”的INTJ 个人主页:用哲学编程-CSDN博客专栏:每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 专业点评 时间复杂度分析 空间复杂度分析 综合点评 我要更强 优化点 …

人事信息管理系统(Java+MySQL)

一、项目背景 在现代企业中,管理大量员工的工作信息、薪资、请假、离职等事务是一项非常繁琐和复杂的任务。传统的手工管理方式不仅效率低下,而且容易出错。为了提高人事管理的效率,减少人工操作带来的错误,企业迫切需要一个高效…

【JAVASE】详讲java案例(中)

这篇接着讲用java语言写程序,本篇文章要讲三道题: (1)数字加密 (2)数组拷贝 (3)打印乘法表 一:数字加密 需求:某系统的数字密码是一个四位数&#xff0c…

【Leetcode】881. 救生艇

文章目录 题目思路代码复杂度分析时间复杂度空间复杂度 结果总结 题目 点击打开题目链接🔗 给定数组 p e o p l e people people 。 p e o p l e [ i ] people[i] people[i]表示第 i i i 个人的体重 ,船的数量不限,每艘船可以承载的最大重…

【李宏毅-生成式 AI】Spring 2024, HW5:LLM Fine-tuning 实验记录

文章目录 1. Task Overview2. Overall Workflow3. Dataset 介绍4. 代码介绍4.1 环境介绍4.2 下载 dataset4.3 下载并加载模型4.2 Notebook 代码1)import 部分2)固定 seed3)加载 LLM4)加载 tokenizer5)设置解码参数6&am…

tcp协议的延迟应答(介绍+原则),拥塞控制(拥塞窗口,网络出现拥塞时,滑动窗口的大小如何确定,慢启动,阈值)

目录 延迟应答 引入 介绍 原则 拥塞控制 引入 网络出现拥塞 引入 介绍 介绍 拥塞窗口 介绍 决定滑动窗口的大小 慢启动 介绍 为什么要有慢启动 阈值 算法 总结 延迟应答 引入 发送方一次发送更多的数据,发送效率就越高 因为要写入网卡硬件的io速度很慢,尽量…

conda 创建环境失败

conda create -n pylableimg python3.10在conda (base)环境下,创建新的环境,失败。 报错: LookupError: didn’t find info-scipy-1.11.3-py310h309d312_0 component in C:\Users\Jane.conda\pkgs\scipy-1.11.3-py310h…

英伟达:史上最牛一笔天使投资

200万美元的天使投资,让刚成立就面临倒闭风险的英伟达由危转安,并由此缔造了一个2.8万亿美元的市值神话。 这是全球风投史上浓墨重彩的一笔。 前不久,黄仁勋在母校斯坦福大学的演讲中,提到了人生中的第一笔融资——1993年&#x…

刷代码随想录有感(98):动态规划——爬楼梯

题干&#xff1a; 代码&#xff1a; class Solution { public:int climbStairs(int n) {if(n 1)return 1;if(n 2)return 2;vector<int>dp(n 1);dp[0] 0;dp[1] 1;dp[2] 2;for(int i 3; i < n; i){dp[i] dp[i - 1] dp[i - 2];}return dp[n];} }; 其实就是斐波…

liquibase做数据库版本管理

通过这个配置就会自动启动liquibase 比对 https://www.cnblogs.com/ludangxin/p/16676701.html https://zhuyizhuo.github.io/2020/07/04/spring-boot/spring-boot-liquibase-database-version-control/

上市公司短视主义数据集(2001-2022年)

数据简介&#xff1a;上市公司短视主义是指公司管理层过于关注短期业绩和股价表现&#xff0c;而忽视公司的长期发展和战略规划。这种短视行为可能会导致公司投资决策的失误&#xff0c;影响公司的长期竞争力。 在上市公司年度报告年度中&#xff0c;通过已有的反映管理者“短…

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

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

快速安装Windows和Ubuntu双系统

一、参考资料 用UltraISO制作Ubuntu16.04 U盘启动盘 DiskPart Command-Line Options 二、相关介绍 1. MBR和GPT分区模式 MBR分区模式 MBR最大仅支持2TB磁盘&#xff0c;超过2TB不可识别。 MBR&#xff08;Master Boot Record&#xff09;&#xff0c;即硬盘的主引导记录分…

【激光雷达】

激光雷达 机械式360扫描雷达半固态激光雷达二维扫描一维扫描 固态激光雷达OPA固态激光雷达&#xff08; 光学相控阵技术&#xff09; FMCW 激光雷达 激光雷达技术在近几年可以说是蓬勃发展&#xff0c;新能源汽车的大量使用&#xff0c;给雷达技术的发展提供了肥沃的土壤&#…

嵌入式作业6

1、利用SysTick定时器编写倒计时程序&#xff0c;如初始设置为2分30秒&#xff0c;每秒在屏幕上输出一次时间&#xff0c;倒计时为0后&#xff0c;红灯亮&#xff0c;停止屏幕输出&#xff0c;并关闭SysTick定时器的中断。 2、利用RTC显示日期&#xff08;年月日、时分秒&…