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  选择建议

  1. 事务需求

    • 需要事务:选择 InnoDB。
    • 不需要事务:可选择 MyISAM、Memory 等。
  2. 数据访问模式

    • 读写并发:选择 InnoDB。
    • 只读或读多写少:可选择 MyISAM。
  3. 持久化需求

    • 持久化:InnoDB、MyISAM。
    • 非持久化:Memory。
  4. 数据规模和性能

    • 数据量大,索引优化重要:选择 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 的服务器会对查询的语句进行优化,确定执行的方案。
  • 完成查询优化后,按照生成的执行计划 调用数据库引擎接口,返回执行结果。

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

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

相关文章

Next.js【详解】CSS 样式方案

全局样式 Global CSS 默认已创建,即 src\app\globals.css,可根据需要修改 默认在全局布局中导入 src\app\layout.tsx import "./globals.css";组件样式 CSS Modules 新建文件 src\app\test\styles.module.css .red {color: red;}导入目标页面…

彻底解决Idea控制台中文乱码问题

中文乱码我相信每一个程序员都会遇到这种问题。 但有时候我们按照网上教程去设置,确实编码好了,但是有时候按照教程来却没能达到我们的预期。 在此之前我将所有编码都设置成了UTF-8,文件编码,项目编码,尝试(最终不需要…

[实现Rpc] 客户端划分 | 框架设计 | common类的实现

目录 3. 客户端模块划分 3.1 Network模块 3.2 Protocol模块 3.3 Dispatcher模块 3.4 Requestor模块 3.5 RpcCaller模块 3.6 Publish-Subscribe模块 3.7 Registry-Discovery模块 3.8 Client模块 4. 框架设计 4.1 抽象层 4.2 具象层 4.3 业务层 ⭕4.4 整体设计框架…

Java里ArrayList和LinkedList有什么区别?

大家好,我是锋哥。今天分享关于【Java里ArrayList和LinkedList有什么区别?】面试题。希望对大家有帮助; Java里ArrayList和LinkedList有什么区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 ArrayList 和 LinkedL…

【Java】分布式锁Redis和Redisson

https://blog.csdn.net/weixin_44606481/article/details/134373900 https://www.bilibili.com/video/BV1nW421R7qJ Redis锁机制一般是由 setnx 命令实现,set if not exists,语法setnx key value,将key设置值为value,如果key不存在…

c++TinML转html

cTinML转html 前言解析解释转译html类定义开头html 结果这是最终效果(部分): ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6cf6c3e3c821446a84ae542bcc2652d4.png) 前言 在python.tkinter设计标记语言(转译2-html)中提到了将Ti…

2.2 反向传播:神经网络如何“学习“?

一、神经网络就像小学生 想象一个刚学算术的小学生,老师每天布置练习题,学生根据例题尝试解题,老师批改后指出错误。神经网络的学习过程与此相似: 输入层:相当于练习题(如数字图片)输出层&…

QEMU 通过网络实现共享文件

系列文章目录 Linux内核学习 Linux 知识(1) Linux 知识(2) WSL Ubuntu QEMU 虚拟机 Linux 调试视频 PCIe 与 USB 的补充知识 vscode 使用说明 树莓派 4B 指南 设备驱动畅想 Linux内核子系统 Linux 文件系统挂载 QEMU 通过网络实现…

当时只道是寻常

晴,2025年2月16日 卸载了油管、脸书和 X 手机 app ,太浪费我时间,以后再去经营吧。 教学技能大赛材料需要在明天之内搞定——《教学实施方案》。感觉玄,同部门有经验的老师说至少花一周时间。 只能明天早点继续接着弄&#xff…

Hive之分区表

Hive之分区表 文章目录 Hive之分区表写在前面分区表分区表基本操作引入分区表创建分区表语法加载数据到分区表中查询分区表中数据增加分区删除分区查看分区表有多少分区查看分区表结构 二级分区正常的加载数据分区表和数据产生关联 动态分区开启动态分区参数设置案例实操 写在前…

【线段树模板】

介绍 这段代码看起来是一个基于树结构的数据结构,可能是线段树或者其他类似的数据结构。主要包含了构建数据结构、查询和修改等基本操作的实现函数。以下是对每个函数的简要介绍: pushup(int u): 用于计算结点u的属性。build(int u, int l, int r): 用于…

DeepSeek辅助测试测试一 -- DeepSeek加MaxKB知识库本地部署

文章目录 前言任务拆解最终目标两种技术路径对比知识库检索增强(RAG) 大语言模型 构建知识库加本地部署DeepSeek目前的问题 前言 开工已经两周啦,开始慢慢的进入工作状态了,新的一年大家一起加油吧~ 任务拆解 最终目标 训练一…

Yuque-DL:一款强大的语雀资源下载工具

语雀是一款常用的文档管理工具,但官方未提供直接下载文档的功能。为此,可以使用第三方工具下载语雀文档。以下是使用步骤: 1. 安装工具 GitHub - gxr404/yuque-dl: yuque 语雀知识库下载 安装步骤: 确保已安装 Node.js&#xff…

【Java 面试 八股文】Spring Cloud 篇

Spring Cloud 篇 1. Spring Cloud 5大组件有哪些?2. 服务注册和发现是什么意思?Spring Cloud 如何实现服务注册发现?3. 我看你之前也用过nacos,你能说下nacos与eureka的区别?4. 你们项目负载均衡如何实现的&#xff1f…

国内外网络安全政策动态(2025年1月)

▶︎ 1.国家互联网信息办公室发布《个人信息出境个人信息保护认证办法(征求意见稿)》 1月3日,国家互联网信息办公室发布《个人信息出境个人信息保护认证办法(征求意见稿)》。根据《意见稿》,个人信息出境个…

图论入门算法:拓扑排序(C++)

上文中我们了解了图的遍历(DFS/BFS), 本节我们来学习拓扑排序. 在图论中, 拓扑排序(Topological Sorting)是对一个有向无环图(Directed Acyclic Graph, DAG)的所有顶点进行排序的一种算法, 使得如果存在一条从顶点 u 到顶点 v 的有向边 (u, v) , 那么在排序后的序列中, u 一定…

Anaconda +Jupyter Notebook安装(2025最新版)

Anaconda安装(2025最新版) Anaconda简介安装1:下载anaconda安装包2: 安装anaconda3:配置环境变量4:检查是否安装成功5:更改镜像源6:更新包7:检查 Jupyter Notebook一.Jup…

VS2022中.Net Api + Vue 从创建到发布到IIS

VS2022中.Net Api Vue 从创建到发布到IIS 前言一、先决条件二、创建项目三、运行项目四、增加API五、发布到IIS六、设置Vue的发布 前言 最近从VS2019 升级到了VS2022,终于可以使用官方的.Net Vue 组合了,但是使用过程中还是有很多问题,这里记录一下. 一、先决条件 Visual …

vue点击左边导航,右边出现页面步骤

vue点击左边导航&#xff0c;右边出现页面 步骤 一定要import不然会出错 index.js Course作为Homeview子路由 Homeview加入<Routerview> 点击跳转<RouterLink to> 父Homeview中有RouterView&#xff08;路由出口&#xff0c;跳转至相应路径&#xff09;和Router…

位运算,双指针,二分,排序算法

文章目录 位运算二进制中1的个数题解代码我们需要0题解代码 排序模版排序1题解代码模版排序2题解代码模版排序3题解代码 双指针最长连续不重复子序列题解代码 二分查找题解代码 位运算 1. bitset< 16 >将十进制数转为16位的二进制数 int x 25; cout << bitset<…