自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(26)
  • 收藏
  • 关注

原创 MySQL中Undo-log是什么?有什么作用?

当一个事务提交时,Undo的旧记录不会立马删除Undo记录,对于旧记录的删除工作,InnoDB中会有专门的purger线程负责,purger线程内部会维护一个ReadView,它会以此作为判断依据,来决定何时移除Undo记录。当一条写入类型的SQL执行时,都会记录Undo-log日志,Undo-log并不存在单独的日志文件,InnoDB默认是将Undo-log存储在xx.ibdata共享表数据文件当中,默认采用段的形式存储。Undo即撤销的意思,通常也称为回滚日志,用来给MySQL撤销SQL操作的。

2024-05-20 23:00:11 639

原创 什么是悲观锁和乐观锁

有了 CAS,就可以实现一个乐观锁,允许多个线程同时读取(因为根本没有加锁操作),但是只有一个线程可以成功更新数据,并导致其他要更新数据的线程回滚重试。如果一个变量 V 初次读取的时候是 A 值,并且在准备赋值的时候检查到它仍然是 A 值,并不能说明是没有被修改过的,这期间可能被改成了其他值然后又改回成了A, CAS 操作就会误认为它从来没有被修改过。乐观控制相信事务之间的数据竞争(data race)的概率是比较小的,因此尽可能直接做下去,直到提交的时候才去锁定,所以不会产生任何锁和死锁。

2024-05-19 19:49:16 478

原创 什么是死锁以及怎么解决死锁

默认情况下监控是关闭的,只有当需要分析问题时再开启,并且在分析问题之后,建议将监控关闭,因为它对数据库的性能有一定影响,另外每 15 秒输出一次日志,会使日志文件变得特别大。在工作过程中偶尔会遇到死锁问题,对于 MySQL 的 InnoDb 存储引擎来说,死锁问题是避免不了的,没有哪种解决方案可以说完全解决死锁问题,但是可以通过一些可控的手段,降低出现死锁的概率。要获取死锁日志,需要开启 InnoDb 的标准监控,推荐将锁监控也打开,它可以提供一些额外的锁信息,在分析死锁问题时会很有用。

2024-05-18 19:24:12 1060

原创 MySQL中锁的几种类型

MySQL根据加锁的范围,可以分为全局锁、表级锁、行级锁三类。

2024-05-17 21:15:20 1077

原创 事务隔离级别有哪些?怎么实现的?

对于当前读,如果事务开启后,并没有执行当前读,而是先快照读,然后这期间如果其他事务插入了一条记录,那么事务后续使用当前读进行查询的时候,就会发现两次查询的记录条目就不一样了,所以就发生幻读。启动两个事务,A和B,当前有一条记录,事务B读取了这条记录,该记录的事务id比当前数据库中活跃事务的最小值还小,说明是在事务B启动前就提交了,所以能够查询到。事务A提交事务后,当前隔离级别是可重复读,事务B在读取记录时,还是基于启动事务时的Read View,所以读取的数据依然是事务A修改前的数据。

2024-05-16 21:33:52 1088

原创 MySQL是如何选择索引的?

在电商业务中会有一个这样的逻辑:会定期扫描支付状态为支付中的订单,然后强制让其关闭,从而释放库存,给其他有需求的买家进行购买。优化器认为一条 SQL 需要创建基于磁盘的临时表,这时的成本是最大的,索引键值的比较、记录之间的比较,其实开销是非常低的,但如果要比较的记录数非常多,则成本会变得非常大。例如支付状态只有已完成、支付中、超时已关闭三种,有一百万条数据,优化器会认为每个状态占用三分之一数据,使用全表扫描,避免二级索引回表效率会更高。在有些低选择性的列上,是有必要创建索引的。比如电商的核心业务表。

2024-05-15 17:54:25 510

原创 什么情况下会造成索引失效?

在 WHERE 子句中,如果在 OR 前的条件列是索引列,而在 OR 后的条件列不是索引列,那么索引会失效。因为索引保存的是索引字段的原始值,而不是 id + 1 表达式计算后的值,所以无法走索引,只能通过把索引字段的取值都取出来,然后依次进行表达式的计算来进行条件判断,因此采用的就是全表扫描的方式。MySQL 5.7 开始,索引特性增加了函数索引,即可以针对函数计算后的值建立一个索引,也就是说该索引的值是函数计算后的值,所以就可以通过扫描索引来查询数据。查询条件中对索引字段使用函数,就会导致索引失效。

2024-05-14 21:05:16 810

原创 MySQL索引的存储结构

索引组织表中数据是根据主键顺序存放在索引中的,即使数据发生了位置变更,主键索引会自动调整数据记录的位置,非主键索引也会根据主键的变化而自动更新。数据和索引是分开存放的,索引是排序后的,但堆数据是无序的进行的都是随机访问,索引的叶子节点中存放的是数据在堆表中的地址,堆表的数据发生改变且位置也发生变更,所有索引中的地址也要更新,非常影响性能。二级索引的好处就是,如果当前字段的值发生改变了,只修改当前字段的二级索引,其他的二级索引不需要更新,除非是对应的主键值也被更新了。,存放的是索引键值和主键值。

2024-05-13 19:19:22 512 1

原创 MySQL中索引的数据结构

随着插入 B+ 树索引的记录变多,1个页(16K)无法存放这么多数据,会发生 B+ 树的分裂,B+ 树的高度变为 2,当 B+ 树的高度大于等于 2 时,根节点和中间节点存放的是索引键对,由(索引键、指针)组成。若要查询索引键值为 5 的记录,先查找根节点,查到键值对(20,地址),表示小于 20 的记录在地址指向的下一层叶子节点中。对于 B+ 树索引,在 MySQL 数据库设计中,仅要求主键的索引设计为顺序,比如使用自增,或使用函数 UUID_TO_BIN 排序的 UUID,而不用无序值做主键。

2024-05-01 20:52:25 670 2

原创 MySQL中怎么存放一条记录

MySQL 中磁盘和内存交互的基本单位是页,一个页的大小一般是 16KB,也就是 16384字节,一个 varchar(n) 类型的列最多可以存储 65532字节,一些大对象如 TEXT、BLOB 可能存储更多的数据,这时一个页可能就存不了一条记录。InnoDB 的数据是按「页」为单位来读写的,每个页默认空间大小是16kb,是InnoDB 存储引擎磁盘管理的最小单元,常见的有数据页、undo 日志页、溢出页等等,行记录是用数据页管理的。二进制位的值是1时,表示该字段是NULL,为0表示不为NULL。

2024-04-30 20:16:25 1084

原创 MySQL中SELECT语句的执行过程

使用组合索引时,可能会有部分字段无法使用到索引,这时可以使用索引下推来减少回表操作,索引下推就是将所有查询条件都判断完成后再回表,没有使用索引下推就只判断了使用到索引的字段,其余字段的查询条件还需要回到Server层来判断。组合索引当遇到范围查询 (>、<) 就会停止匹配,也就是。

2024-04-29 16:23:48 1746 2

原创 二级索引为什么能直接从叶子节点获取获取数据?

当你执行这个查询时,数据库系统可以直接从索引的叶子节点中获取到需要的字段值,因为索引叶子节点中已经存储了主键值,数据库系统可以利用这些主键值直接访问主键索引或数据页,而不需要回表到原始数据表。在覆盖索引的情况下,二级索引的叶子节点存放的确实是主键索引键值和主键值,而不是完整的数据行。就是因为我们查询需要的字段不在索引中,那么数据库无法直接从索引中获取所有我们需要的数据,这样的数据是不完整的,因此需要回表到原始数据表中获取额外的数据字段。今天在看索引覆盖的时候,看到了这么一句话。

2024-04-28 22:41:20 374

原创 MySQL中的索引及怎么使用

如果定义了主键,MySQL 会使用主键作为聚集索引,如果没有主键,会使用第一个所有值都是NOT NULL的UNIQUE索引作为聚集索引。定义多字段索引时,应将 WHERE 子句中常用的字段放在索引列表的开头,将不常用的列放在索引列列表的后面。聚集索引是一种特殊的索引,索引中键值的顺序决定了表中相应行的物理顺序。相比为整个字符串列创建索引,前缀索引能减少磁盘的使用量,提高索引的写入速度。MySQL 唯一索引是一种特殊的索引,它不但可以加快从表中检索数据的速度,还能防止在指定的一个或多个列中出现重复值。

2024-04-28 15:55:05 1165

原创 讲清楚MySQL主键和外键

一般类型设为 INT(最大可表示2亿,一般足够了,要根据具体的需求决定),设为主键后自动变为不可为空,另外还要设定 AI(Auto Incremental)自动递增,这样会方便许多,不需要担心主键唯一性的问题。RESTRICT: 如果被引用的表中的一行在该表中有匹配的行,试图删除或更新被引用的表中行时会引发 MySQL 错误。SET NULL:如果被引用的表中的一行被删除或更新,该表中匹配行的值设置为 NULL。CASCADE:如果被引用的表中的一行被删除或更新,该表中匹配行的值会。1.7. 主键和外键。

2024-04-27 17:02:40 406 1

原创 MySQL中的数据类型及一些应用场景

使用能满足你需求的最小整数类型,如储存人的年龄用 UNSIGNED TINYINT 就足够了,至少可见的未来内没人能活过255岁,因为数据需要在磁盘和内存间传输,虽然不同类型间只有几个字节的差异,但数据量大了以后对空间和查询效率的影响就很大了,所以在数据量较大时,有意识地分配每一字节,保持数据最小化是很有必要的。超出部分如果是空格会截断,不是空格会报错。例如,当前数据库记录存储的长度不一致,当记录4更新后数据长度增加了,原先的空间无法容纳更新后的记录了,会将记录4删除再寻找新的空间给记录4使用。

2024-04-26 19:01:32 1185

原创 什么是事务和并发

现在有两个会话(注意是两个链接(connection),而不是同一个会话下的两个SQL标签,这两个链接相当于是在模拟两个用户)都要执行这段语句,用调试逐句执行, 当第一个执行到UPDATE 而还没有 COMMIT 提交时,转到第二个会话,执行到UPDATE语句时会一直等待执行(若等的时间太久会超时而放弃执行),这时跳回第一个对话 COMMIT 提交,第二个会话的 UDDATE 才执行成功,最后将第二段对话的事务也COMMIT提交,此时刷新顾客表会发现1号顾客的积分多了20分。换成 ROLLBACK;

2024-04-25 18:41:03 1167

原创 MySQL子查询的用法及原理

不仅 WHERE 筛选条件里可以用子查询,SELECT 选择子句和 FROM 来源表子句也能用子查询,简单讲就是,SELECT选择语句是用来确定查询结果包含哪些字段,每个字段都可以是一个表达式,而每个字段表达式里的元素除了可以是原始的列,具体的数值,也同样可以是其它各种子查询的结果。之前都是非关联主/子(外/内)查询,比如子查询先查出整体的某平均值或满足某些条件的一列id,作为主查询的筛选依据,这种子查询与主查询无关,会先一次性得出查询结果再返回给主查询供其使用。子查询的层级用括号实现。

2024-04-24 18:09:39 1101

原创 MySQL如何进行增删改操作

如果不需要全部的数据,就选用原表中部分数据创建副本表,如,用今年以前的 orders 创建一个副本表 orders_archived,其实就是在子查询里增加了一个WHERE orders<今年时间的 语句进行筛选。对于AI (Auto Incremental 自动递增) 的id字段,MySQL会记住删除的/用过的id,并在此基础上递增——目前有10条数据,删除了最后两条数据再进行插入数据后,会在10的基础上递增。INSERT INTO 表名 子查询 很常用,子查询替代原先插入语句中 VALUES(……

2024-04-23 18:24:31 691

原创 MySQL多表查询操作的一写关键字

说明:这样是INNER JOIN,只展示有订单的顾客(及其订单),也就是两张表的交集(没订单的顾客不会显示),但注意这里因为一个顾客可能有多个订单,所以INNER JOIN以后顾客信息其实是是广播了的,即一条顾客信息被多条订单记录共用,当然 这叫。如下面的例子,员工的上级也是员工,所以也在员工表里,想得到员工和他的上级信息的合并表,就要员工表自己和自己合并,如果上级是老板没有上级了也需要显示出来,作为合并条件(join condition)的字段在两个表中有相同的字段名时,可用 USING (……

2024-04-22 22:26:53 1255

原创 MySQL关于查询语句使用的一些关键字

有时候按照字段的值排序不能满足要求,可以自定义排序。比如,需要按照电影分级。

2024-04-21 18:56:36 1227

原创 Java Web 应用程序的资源文件存放位置

后来查了一下Content root 和source root的区别 "Content root" 是项目根目录,而 "Source root" 是源代码根目录。今天在写苍穹外卖时需要读一个表格,然后把营业额数据写到这个表格中,这个表格我就随手拖到根目录了。:项目的根目录,包含项目的所有内容,包括源代码、资源文件、配置文件等。大多数情况下,内容根目录也是源代码根目录,但它还包含其他项目文件。通常,源代码根目录下的文件和文件夹包含项目的源代码文件。源代码根目录可能包含资源文件,如静态页面、样式表等。

2024-04-19 22:50:24 369

原创 动态代理的原理及执行流程

用一个具体的例子来说明一下,你有一家目标公司你想去这家公司上班,你不能直接联系到老板就需要通过HR来进入到这家公司。你和目标公司都是明确的,HR就是代理对象。哪什么是动态代理呢?:类加载器。指定了用于加载动态代理类的类加载器。动态代理类是在运行时生成的,因此需要一个类加载器来加载它。Class<?:接口数组。是一个 Class 对象的数组,包含了被代理对象所实现的接口列表。动态代理对象将会实现这些接口,并且可以被强制转换为其中的任何一个接口类型。:调用处理器。这个参数实现了。

2024-04-19 12:58:00 704

原创 entity,vo,dto,是什么?有什么区别

实体通常指的是表示业务概念或对象的对象模型,被映射到数据库表中,用于持久化数据。实体通常包含属性和方法来描述其行为和状态。例如,在一个图书馆管理系统中,书籍可以是一个实体,它可能具有属性如书名、作者、出版日期等。:值对象是一个简单的数据对象,其主要作用是封装一组相关的数据,并且通常是不可变的。值对象的主要特点是它们的相等性通常由其属性决定,而不是由标识符决定。在一些领域驱动设计(DDD)中,值对象用于表示概念上的值,例如日期范围、货币金额等。值对象通常不具有行为,而仅仅是一组数据的容器。

2024-04-17 00:07:58 689

原创 Java中怎么操作Reids?

本文章重点讲解Spring Data Redis 是 Spring 的一部分,提供了在 Spring 应用中通过简单的配置就可以访问 Redis 服务,对 Redis 底层开发包进行了高度封装。在 Spring 项目中,可以使用Spring Data Redis来简化 Redis 操作。string数据操作set类型数据操作 无序存储zset类型数据操作 每个成员由一个浮点类型的分数 有序存储hash类型的数据操作 散列 适合存储对象list类型的数据操作 列表 顺序存储。

2024-04-15 23:08:36 780

原创 什么是Redis?

Redis是一个基于的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的。官方提供的数据是可以达到的QPS(每秒内查询次数)。能够存储的value类型比较丰富,也被称为结构化的(Not Only SQL)数据库。不仅仅是SQL,泛指。NoSql数据库并不取代关系型数据库,而是关系型数据库的补充。

2024-04-15 00:18:39 367

原创 苍穹外卖Day06-小程序微信登录时401问题

苍穹外卖

2024-04-12 16:53:29 282 2

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除