java八股文-mysql
1. 索引
1.1 什么是索引
- 索引(index)是帮助Mysql高效获取数据的数据结构(有序).
- 提高数据的检索效率,降低数据库的IO成本(不需要全表扫描).
- 通过索引列对数据进行排序,降低数据排序成本,降低了CPU的消耗.
1.2 mysql索引使用的B+树?
1. 没有使用二叉树,最坏情况o(n),红黑树,的话数据量大了,层级太多2. b+ 树的话每个节点不是只有一个节点,多路的3. b树的话 每个节点都指向数据,b+只有叶子结点4. 这样b+更优秀,因为不会加载路径上的数据了
1.3 mysql的常用存储引擎?
1.3.1 比较

1.3.2 选择建议
-
事务需求:
- 需要事务:选择 InnoDB。
- 不需要事务:可选择 MyISAM、Memory 等。
-
数据访问模式:
- 读写并发:选择 InnoDB。
- 只读或读多写少:可选择 MyISAM。
-
持久化需求:
- 持久化:InnoDB、MyISAM。
- 非持久化:Memory。
-
数据规模和性能:
- 数据量大,索引优化重要:选择 InnoDB。
- 极高性能,数据可以丢失:选择 Memory。
1.3.3 总结
- MySQL 提供了多种存储引擎以满足不同的需求。
- InnoDB 是大多数场景下的首选,因其支持事务、高并发和外键。
- 其他存储引擎(如 MyISAM、Memory)则适用于特定的场景。
1.4 什么事聚集索引和非聚集索引(二级索引)?
简单说聚簇索引,只能有一个,表示物理排序了,聚族索引的叶子结点保存的是整条数据,非聚簇索引保存的是id。(这样使用聚集索引查询非索引字段也不用回表查询了)
1.5 回表查询?
简单说如图查询条件是有索引的,但是查询到后,他并没有全量数据,只能拿到主键id,然后在去聚族索引,所以还要回表查询。
1.6 覆盖索引?
如图,覆盖索引就是查询能返回,所需要到列。第三个sql中gender一次得不到的
1.7 mysql超大分页如何处理?
1.7.1 覆盖索引解决
1.7.2.
select id from user where id>10000 limit10 取出多少后的再去获取, 有序的得
1.7.3.
业务层面说 最好限制下,查询到一百页
1.8 索引创建的原则
- 真的数据量的的,查询频繁的表建立索引.(单表超过十万条)
- 针对常作为查询条件(where),排序(order by),分组(group by)操作字段建立索引.
- 尽量选择区分度高的列作为索引,区分度越高,使用索引效率越高.
- 如果是字符串字段,长度较长,针对字段特点,建立前缀索引.
- 尽量使用联合索引,减少单列索引,查询时联合索引很多时候可以覆盖索引,节省存储空间,避免回表查询,条高效率
- 控制索引数量,并不是越多越好,越多维护代价越大,影响增删改差的效率.
- 如果索引不能存储NULL值,建表的时候使用not null,当优化器知道每列是否包含null值时,可以更好的确定那个索引最有效的用于查询.
1.9 索引失效的情况
使用联合索引的时候,没有按照排序查询.
- 违反最左前缀法则.
- 范围查询右边的列,不能使用索引.
- 不要在索引上进行运算操作,索引将失效.
- 字符串不加单引号,造成索引失效(类型转换).
- 一%开头的like模糊查询,索引失效
2. 事务
2.1 事物特性
事务是一组操作的特性,一个不可以分割的工作单位,会把所有操作作为一个整体,向系统提交或者撤销,要么同成功,要么同时失败举例子,转账A给B转账,要同时一个减少,一个增加。
2.2 ACID
- 原子性(atomicity) :事务是不可分割的最小操作单元,要么全成功,要么全失败.
- 一致性(Consistency):事务完成时,必须使所有的数据保持一致状态.
- 隔离性(Isolation): 数据库系统提供的隔离机制,保证事务再不受外部并发操作影响的独立环境运行.
- 持久性(Durability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的.
2.3 并发事务问题
2.4 undo log 和redo log
2.4.1 redo log
2.4.2 undo log
2.4.3 区别:
2.5 事务的隔离性如何保证?
5.4.1锁机制
- 在高隔离级别下,数据库使用锁(如行锁、表锁等)来控制事务间的并发。通过加锁机制,事务可以在执行过程中确保数据的完整性和一致性。
- 行级锁:保证了同一行数据在多个事务之间的独立性,减少了锁的竞争,提高了并发性。
- 表级锁:锁定整个表,确保没有其他事务对表进行修改,但会降低并发性。
5.4.2 MVCC
- MVCC 允许数据库在同一时间保持多个版本的数据。事务可以读取到数据的某个版本,从而避免了读锁和写锁的冲突。许多现代的关系型数据库使用 MVCC 来实现更高的并发和隔离性。
- 在 MVCC 中,每个事务会看到数据库中数据的某个快照,避免了幻读的问题。
- 记录中的隐藏字段
- undo log
- readview
3. 分库分表
3.1应用场景
1. 前提,项目业务数据逐渐增多,业务发展迅速,单标1000w或20G以上
2.优化解决不了新能问题(索引,主从读写分离)
3.IO瓶颈,CPU瓶颈
3.2 概念
- 分库是一种水平扩展数据库的技术,将数据根据一定规则划分到多个独立的数据库中。每个数据库只负责存储部分数据,实现了数据的拆分和分布式存储。分库主要是为了解决并发连接过多,单机 mysql扛不住的问题。
- 分表指的是将单个数据库中的表拆分成多个表,每个表只负责存储一部分数据。这种数据的垂直划分能够提高查询效率,减轻单个表的压力。分表主要是为了解决单表数据量太大,导致查询性能下降的问题。
3.2 拆分策略
3.2.1 垂直分库:
根据业务模块将不同的表分配到不同的数据库中。
例如,将用户信息表放在一个数据库中,将订单信息表放在另一个数据库中。.
3.2.2 水平分库:
将同一个表的数据按一定规则(如按用户ID分区)拆分到多个数据库中。
例如,用户ID为1-10000的数据放在数据库A中,用户ID为10001-20000的数据放在数据库B中。
3.2.3 垂直分表
将一个表的不同列拆分到不同的表中,这些表可以存储不同的列数据,但通常是基于业务逻辑或者字段访问频率来拆分。
例如一个订单状态信息会频繁进行更新、订单金额在列表会频繁被查询到作为热点数据,而下单地址、手机号码等信息基本不会改变或者改变次数很少作为非热点数据。
垂直分表的原则
(1)、把不常用的字段单独放一张表。
(2)、把text、blob等大字段拆分出来单独放在一张表。
(3)、经常组合查询的字段单独放在一张表中。
3.2.4 水平分表
将一个大表拆分成多个小表,每个小表存储数据的不同片段。
3.4 你们怎么用的?
分库分表是两回事儿,可以只分库不分表,也可以只分表不分库,分库主要解决高并发瓶颈,分表主要解决数据量大瓶颈,但是一般情况下,我们都需要同时做分库分表。
3.4.1 我们垂直分表
把一张业务表中的备注字段拆分了,平时不咋用,偶尔用,但是他还比较大,是text类型.
3.4.2 水平分表
每天数据量表较大,单表数据量过大,现在按照每天一张表
4. 主从同步
4.1 主从作用?
- 数据的热备,后备数据库,主库故障后可以切换到备库,避免数据丢失.
- 机构扩展,业务量大后,IO增加,单裤无法满足需求,提高单机的io.
- 读写分离,是数据库支撑更大的开发
4.2 主从同步原理
通过bionlog

主库写 binlog:主库的更新 SQL(update、insert、delete) 被写到 binlog;
主库发送 binlog:主库创建一个 log dump 线程来发送 binlog 给从库;
从库写 relay log:从库在连接到主节点时会创建一个 IO 线程,以请求主库更新的 binlog,并且把接收到的 binlog 信息写入一个叫做 relay log 的日志文件;
从库回放:从库还会创建一个 SQL 线程读取 relay log 中的内容,并且在从库中做回放,最终实现主从的一致性。
4.3 开发场景
预算项目,经常要做去全部员工薪资数据的计算,然后做报表到处,刚开始没做读写分离的时候,一旦有人操作计算,就会导致mysql压力剧增,影响其他页面的查询,所以后来切换为主从模式,主库做计算等写操作,从库只读.
4.4 遇到的问题?
4.4.1 主从延迟
这个问题在生产上就发生了,用户操作后,显示成功,但是返回页面却发现数据没有改变,就是主从数据同步出现了延迟
解决 :
- 从库机器性能:从库机器比主库的机器性能差,只需选择主从库一样规格的机器就好。
- 从库压力大:可以搞了一主多从的架构,还可以把 binlog 接入到 Hadoop 这类系统,让它们提供查询的能力。
- 从库过多:要避免复制的从节点数量过多,从库数据一般以3-5个为宜。
- 大事务:如果一个事务执行就要 10 分钟,那么主库执行完后,给到从库执行,最后这个事务可能就会导致从库延迟 10 分钟啦。日常开发中,不要一次性 delete 太多 SQL,需要分批进行,另外大表的 DDL 语句,也会导致大事务。
- 网络延迟:优化网络,比如带宽 20M 升级到 100M。
- MySQL 版本低:低版本的 MySQL 只支持单线程复制,如果主库并发高,来不及传送到从库,就会导致延迟,可以换用更高版本的 MySQL,支持多线程复制。
5. 如何定位慢查询?
5.1原因
聚合查询,多表查询;表数据量过大;深度分页查询,索引
5.2 工具
- arthas进行定位,看是不是执行sql的时候耗时比较长
- 运维工具 prometheus
5.3 mysql自带慢查询日志(生产不会开启,损耗性能)

5.4 慢查询sql如何优化
使用explain和desc命令获取执行select语句的信息



type 是index和all的时候就要考虑优化了

6. sql优化经验(说参考阿里的开发手册)
6.1 表优化

6.2 库设计优化

6.3 sql语句优化
统计时尽量使用count(),count()≈count(1),大于count(主键) (count(*)标准语法推荐;做了很多优化count(列名),慢还会查询不为空的数据)。
如果明确查找一条语句,请使用limit1;,因为找到一条符合条件的记录后就不会继续查找了。
优化分页查询
使用limit limit 1000000,100;偏移量十万后查询很慢了,
子查询优化 select * from table where id>=(select id from table limit 100000,1) limit 100;
换一种写法 select * from table where id >= 1000001 limit 100;
避免 Select *用到什么字段就具体写什么字段,原因除了 select * 查询所有字段会多出网络传输开销之外,还有更重要的一点是,select * 无法使用覆盖索引。
尽量使用 MySQL 5.6以后的版本
对于使用索引方面对索引字段做函数操作或者做运算操作,都不能使用上索引。所以针对这一点,除了我们索引的字段不要加函数之外。还要注意一些隐式转换,比如,交易日志表(tradelog),tradeid 的字段类型是 varchar(32),字段有索引,但是当你执行 select * from tradelog where tradeid=110717;语句,你发现走的还是全索引扫描。这是因为它其实做了类型转换,相当于这么执行mysql> select * from tradelog
7. mysql架构

7.1 逻辑架构
MySQL 逻辑架构图主要分三层:
- 客户端:最上层的服务并不是MySQL所独有的,大多数基于网络的客户端/服务器的工具或者服务都有类似的架构。比如连接处理、授权认证、安全等等。
- Server层:大多数MySQL的核心服务功能都在这一层,包括查询解析、分析、优化、缓存以及所有的内置函数(例如,日期、时间、数学和加密函数),所有跨存储引擎的功能都在这一层实现:存储过程、触发器、视图等。
- 存储引擎层:第三层包含了存储引擎。存储引擎负责 MySQL 中数据的存储和提取。Server 层通过 API 与存储引擎进行通信。这些接口屏蔽了不同存储引擎之间的差异,使得这些差异对上层的查询过程透明。
7.2 一条SQL查询语句在MySQL中如何执行的?
- 先检查该语句 是否有权限,如果没有权限,直接返回错误信息,如果有权限会先查询缓存.
- 如果没有缓存,分析器进行 语法分析,提取 sql 语句中 select 等关键元素,然后判断 sql 语句是否有语法错误,比如关键词是否正确等等。
- 语法解析之后,MySQL 的服务器会对查询的语句进行优化,确定执行的方案。
- 完成查询优化后,按照生成的执行计划 调用数据库引擎接口,返回执行结果。
相关文章:
java八股文-mysql
1. 索引 1.1 什么是索引 索引(index)是帮助Mysql高效获取数据的数据结构(有序).提高数据的检索效率,降低数据库的IO成本(不需要全表扫描).通过索引列对数据进行排序,降低数据排序成本,降低了CPU的消耗. 1.2 mysql索引使用的B树? 1. 没有使用二叉树,最坏情况o&…...
Cherno C++ P55 宏
这篇文章我们讲一下C当中的宏。其实接触过大型项目的朋友可能都被诡异的宏折磨过。 宏是在预处理当中,通过文本替换的方式来实现一些操作,这样可以不用反复的输入代码,帮助我们实现自动化。至于预处理的过程,其实就是文本编辑&am…...
MybatisMybatisPllus公共字段填充与配置逻辑删除
Mybatis/MybatisPllus公共字段填充与配置逻辑删除 在开发过程中,很多时候需要处理一些公共字段,例如:创建时间、修改时间、状态字段等。这些字段通常会在插入或更新数据时进行填充,以便记录数据的变化和状态。同时,逻…...
VS Code User和System版区别【推荐使用System版本】and VSCode+Keil协同开发之Keil Assistant
VS Code User和System版区别 Chapter1 VS Code User和System版区别1. 对于安装而言2. 结束语 Chapter2 VS Code 安装、配置教程及插件推荐插件: Chapter3 VSCodeKeil协同开发之Keil Assistant1. 效果展示2. Keil Assistant简介3. Keil Assistant功能特性4. 部署步骤…...
MongoDB:listDatabases failed : not master and slaveOk=false
个人博客地址:MongoDB:listDatabases failed : not master and slaveOkfalse | 一张假钞的真实世界 异常描述 如果在MongoDB的SECONDARY上查询数据时会报如下错误信息: > show databases; 2018-09-20T17:40:55.3770800 E QUERY [thread…...
Python的那些事第二十二篇:基于 Python 的 Django 框架在 Web 开发中的应用研究
基于 Python 的 Django 框架在 Web 开发中的应用研究 摘要 Django 是一个基于 Python 的高级 Web 框架,以其开发效率高、安全性和可扩展性强等特点被广泛应用于现代 Web 开发。本文首先介绍了 Django 的基本架构和核心特性,然后通过一个实际的 Web 开发项目案例,展示了 Dj…...
【ISO 14229-1:2023 UDS诊断(会话控制0x10服务)测试用例CAPL代码全解析④】
ISO 14229-1:2023 UDS诊断【会话控制0x10服务】_TestCase04 作者:车端域控测试工程师 更新日期:2025年02月15日 关键词:UDS诊断、0x10服务、诊断会话控制、ECU测试、ISO 14229-1:2023 TC10-004测试用例 用例ID测试场景验证要点参考条款预期…...
图论入门算法:拓扑排序(C++)
上文中我们了解了图的遍历(DFS/BFS), 本节我们来学习拓扑排序. 在图论中, 拓扑排序(Topological Sorting)是对一个有向无环图(Directed Acyclic Graph, DAG)的所有顶点进行排序的一种算法, 使得如果存在一条从顶点 u 到顶点 v 的有向边 (u, v) , 那么在排序后的序列中, u 一定…...
【CXX】2 CXX blobstore客户端说明
本示例演示了一个调用blobstore服务的C客户端的Rust应用程序。事实上,我们会看到两个方向的调用:Rust到C以及C到Rust。对于您自己的用例,您可能只需要其中一个方向。 示例中涉及的所有代码都显示在此页面上,但它也以可运行的形式提…...
HTTP相关面试题
HTTP/1.1、HTTP/2、HTTP/3 演变 HTTP/1.1 相比 HTTP/1.0 提高了什么性能? HTTP/1.1 相⽐ HTTP/1.0 性能上的改进: 使⽤长连接的⽅式改善了 HTTP/1.0 短连接造成的性能开销。⽀持管道(pipeline)网络传输,只要第⼀个请…...
关于XML映射器的基本问题
前言 XML 映射器是 MyBatis 中用于定义 SQL 语句及其与 Java 对象映射关系的 XML 文件。它通过 XML 配置将数据库操作与 Java 代码分离,使 SQL 语句更易维护和管理。 主要作用 定义 SQL 语句:在 XML 中编写 SQL 查询、插入、更新和删除操作。 映射结果…...
【MyBatis】预编译SQL与即时SQL
目录 1. 以基本类型参数为例测试#{ }与${ }传递参数的区别 1.1 参数为Integer类型 1.2 参数为String类型 2. 使用#{ }传参存在的问题 2.1 参数为排序方式 2.2 模糊查询 3. 使用${ }传参存在的问题 3.1 SQL注入 3.2 对比#{ } 与 ${ }在SQL注入方面存在的问题 3.3 预编译…...
Python--正则表达式
1. 日志打印与终端颜色控制 1.1 使用 loguru 打印日志 from loguru import loggerlogger.debug("调试信息") logger.info("普通信息") logger.warning("警告信息") logger.error("错误信息") logger.success("成功信息"…...
【java面试】线程篇
1.什么是线程? 线程是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。 2.线程和进程有什么区别? 线程是进程的子集,一个进程可以有很多线程,每条线程并行执行不同的任…...
分布式光纤传感:为生活编织“感知密网”
分布式光纤测温技术虽以工业场景为核心,但其衍生的安全效益已逐步渗透至日常生活。 分布式光纤测温技术(DTS)作为一种先进的线型温度监测手段,近年来在多个领域展现了其独特的优势。虽然其核心应用场景主要集中在工业、能源和基础…...
cmake Qt Mingw windows构建
今天教大家怎么在windows构建qt应用使用cmd命令行,而不是一键通过QtCreator一键构建。首先我们用qtcreator创建一个模板程序(PS:记得在安装qt时要悬着mingw套件,如果安装太慢可以换源) 输入以下的命令: mkdir build …...
无人机信号调制技术原理
一、调制技术的必要性 频谱搬移:将低频的基带信号搬移到高频的载波上,便于天线辐射和传播。 信道复用: 利用不同的载波频率或调制方式,实现多路信号同时传输,提高信道利用率。 抗干扰: 通过选择合适的调…...
书评与笔记:《如何有效报告Bug》
文章目录 书评笔记核心原则1. 首要目标:让程序员亲眼看到问题2. 次要目标:详细描述问题3. 保持冷静,避免误操作4. 提供额外信息5. 清晰、准确地表达 实用建议不要自作聪明地诊断问题类比:看医生时的症状描述程序员的心理 总结 原文…...
3.【线性代数】——矩阵乘法和逆矩阵
三 矩阵乘法和逆矩阵 1. 矩阵乘法1.1 常规方法1.2 列向量组合1.3 行向量组合1.4 单行和单列的乘积和1.5 块乘法 2. 逆矩阵2.1 逆矩阵的定义2.2 奇异矩阵2.3 Gauss-Jordan 求逆矩阵2.3.1 求逆矩阵 ⟺ \Longleftrightarrow ⟺解方程组2.3.2 Gauss-Jordan求逆矩阵 1. 矩阵乘法 1.…...
[JVM篇]虚拟机性能监控、故障处理工具
虚拟机性能监控、故障处理工具 基础故障处理工具 jps(JVM Peocess Status Tool - 虚拟机进程状况工具) jstat(JVM Statistics Monitoring Too - 虚拟机统计信息监视工具) jinfo( Configuration info for Java - Java配置信息工具) jmap(Memory Map for…...
大数据学习栈记——Neo4j的安装与使用
本文介绍图数据库Neofj的安装与使用,操作系统:Ubuntu24.04,Neofj版本:2025.04.0。 Apt安装 Neofj可以进行官网安装:Neo4j Deployment Center - Graph Database & Analytics 我这里安装是添加软件源的方法 最新版…...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
Debian系统简介
目录 Debian系统介绍 Debian版本介绍 Debian软件源介绍 软件包管理工具dpkg dpkg核心指令详解 安装软件包 卸载软件包 查询软件包状态 验证软件包完整性 手动处理依赖关系 dpkg vs apt Debian系统介绍 Debian 和 Ubuntu 都是基于 Debian内核 的 Linux 发行版ÿ…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
【论文笔记】若干矿井粉尘检测算法概述
总的来说,传统机器学习、传统机器学习与深度学习的结合、LSTM等算法所需要的数据集来源于矿井传感器测量的粉尘浓度,通过建立回归模型来预测未来矿井的粉尘浓度。传统机器学习算法性能易受数据中极端值的影响。YOLO等计算机视觉算法所需要的数据集来源于…...
