java八股文-mysql

news2025/2/22 12:27:26

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.coloradmin.cn/o/2299588.html

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

相关文章

YOLO11环境搭建CUDA12.6

1.安装CUDA和cuDNN 1.1安装CUDA 1.1.1查看当前你的电脑显卡支持的最高CUDA版本,后面的安装不能超过它 通过命令的方式查看 输入nvidia-smi 1.1.2 下载CUDA 官网地址:CUDA Toolkit Archive | NVIDIA Developer 选择cuda_12.6.3 下载完成后,如下: 安装,一直下一步即可:…

OpenEuler学习笔记(三十二):在OpenEuler上搭建项目管理平台

在OpenEuler上搭建一个支持网页和手持访问、且支持用户功能自定义的项目管理平台,可以选择多种开源工具。以下是基于 Redmine 的搭建方案,Redmine 是一个灵活的项目管理工具,支持网页和移动端访问,并且可以通过插件扩展功能。 1.…

LabVIEW中的icon.llb 库

icon.llb 库位于 C:\Program Files (x86)\National Instruments\LabVIEW 2019\vi.lib\Platform 目录下,是 LabVIEW 系统中的一个重要库。它的主要功能是与图标相关的操作,提供了一些实用的 VI 用于处理 LabVIEW 图标的显示、修改和设置。通过该库&#x…

React Hooks 的两个坑点

React Hooks 使用注意事项 Area: Hooks Date: February 10, 2025 Important: 🌟🌟🌟 React Hooks 注意事项 要点: useState 的初始化值 只在第一次渲染时计算,并且这个值不会随着组件重新渲染而更新。useEffect 可…

Oracle启动与关闭(基础操作)

11g读取参数文件的顺序 9i之前,只有静态参数文件pfile文件。 9i开始,引入了动态参数文件spfile文件。 Windows: %ORACLE_HOME%\database SPFILEORCL就是动态参数文件 Linux: $ORACLE_HOME/dbs 11g中,启动数据库。…

新版电脑通过wepe安装系统

官方下载链接 WIN10下载 WIN11下载 微PE 启动盘制作 1:选择启动盘的设备 2:选择对应的U盘设备,点击安装就可以,建议大于8g 3:在上方链接下载需要安装的程序包,放入启动盘,按需 更新系统 …

Jmeter断言、关联、录制脚本

Jmeter断言 断言:让程序自动判断预期结果和实际结果是否一致 提示: Jmeter在请求的返回层面有个自动判断机制(响应状态码 2xx:成功,4xx/5xx:失败)但是请求成功了,并不代表结果一定正确,因此需要检测机制提…

SpringBoot速成(12)文章分类P15-P20

1.新增文章分类 1.Postman登录不上,可以从头registe->login一个新的成员:注意,跳转多个url时,post/get/patch记得修改成controller类中对应方法上写的 2.postman运行成功: 但表中不更新:细节有问题: c是…

RedHat8安装postgresql15和 postgis3.4.4记录及遇到的问题总结

安装包对照版本参考 UsersWikiPostgreSQLPostGIS – PostGIS 如果Red Hat系统上有旧版本的PostgreSQL需要卸载 在较新的Red Hat版本,使用dnf包管理器卸载:sudo dnf remove postgresql-server postgresql 旧版本,使用yum包管理器卸载 sudo y…

深入解析计算机网络请求头:常见类型与安全性影响

目录 1. Host 2. User-Agent 3. Cookie 4. Referer(或 Referrer) 5. Authorization 6. Content-Type 7. Content-Length 8. Origin 9. X-Forwarded-For (XFF) 10. Upgrade-Insecure-Requests 11. X-Frame-Options 12. Cache-Control 13. Ac…

VisoMaster整合包及汉化

VisoMaster是个图片及视频换脸工具,速度快,性能十分强大。 VisoMaster安装有2种方式,根据官网指引安装也十分简单,在此就不重复,只说说安装过程中要注意的事项: 1、自动安装:需要在网络十分畅…

从安装软件到flask框架搭建可视化大屏(二)——创建一个flask页面,搭建可视化大屏,零基础也可以学会

附录:所有文件的完整代码 models.py # models/models.py from flask_sqlalchemy import SQLAlchemydb SQLAlchemy()class User(db.Model):__tablename__ user # 显式指定表名为 userid db.Column(db.Integer, primary_keyTrue)username db.Column(db.String(…

[JVM篇]垃圾回收器

垃圾回收器 Serial Seral Old PartNew CMS(Concurrent Mark Sweep) Parallel Scavenge Parallel Old G1 ZGC

DeepSeek专题:DeepSeek-V1核心知识点速览

AIGCmagic社区知识星球是国内首个以AIGC全栈技术与商业变现为主线的学习交流平台,涉及AI绘画、AI视频、大模型、AI多模态、数字人以及全行业AIGC赋能等100应用方向。星球内部包含海量学习资源、专业问答、前沿资讯、内推招聘、AI课程、AIGC模型、AIGC数据集和源码等…

SpringBoot+shardingsphere实现按月分表功能

SpringBootshardingsphere实现按月分表功能 文章目录 前言 ShardingSphere 是一套开源的分布式数据库中间件解决方案,旨在简化数据库分片、读写分离、分布式事务等复杂场景的管理。它由 Apache 软件基金会支持,广泛应用于需要处理大规模数据的系统中 一…

教程 | 从零部署到业务融合:DeepSeek R1 私有化部署实战指南

文章目录 1. 什么是 DeepSeek R1?a. 主要介绍a. 版本区别 2. 部署资源要求a. 硬件资源要求 3. 本地安装DeepSeek-R1a. 为什么选择本地部署?b. 部署工具对比c. 演示环境配置d. Ollama安装流程 4. 可视化工具a. 工具对比b. Open-WebUI部署 5. AI API应用a.…

分布式 NewSQL 数据库(TiDB)

TiDB 是一个分布式 NewSQL 数据库。它支持水平弹性扩展、ACID 事务、标准 SQL、MySQL 语法和 MySQL 协议,具有数据强一致的高可用特性,是一个不仅适合 OLTP 场景还适合 OLAP 场景的混合数据库。 TiDB是 PingCAP公司自主设计、研发的开源分布式关系型数据…

C语言-章节 1:变量与数据类型 ——「未初始化的诅咒」

在那神秘且广袤无垠的「比特大陆」上,阳光奋力地穿过「内存森林」中错综复杂的代码枝叶缝隙,洒下一片片斑驳陆离、如梦似幻的光影。林间的空气里,弥漫着一股浓郁的十六进制锈蚀味,仿佛在诉说着这片森林中隐藏的古老秘密。 一位零基…

HTML的入门

一、HTML HTML(HyperText Markup Language,超文本标记语言)是一种用来告知浏览器如何组织页面的标记语言。 超文本:就是超越了文本;HTML不仅仅可以用来显示文本(字符串、数字之类),还可以显示视频、音频等…

闭源大语言模型的怎么增强:提示工程 检索增强生成 智能体

闭源大语言模型的怎么增强 提示工程 检索增强生成 智能体 核心原理 提示工程:通过设计和优化提示词,引导大语言模型进行上下文学习和分解式思考,激发模型自身的思维和推理能力,使模型更好地理解和生成文本,增强其泛用性和解决问题的能力。检索增强生成:结合检索的准确…