- 博客(40)
- 收藏
- 关注
原创 Redis的内存淘汰策略
应用中存在一些热点数据(即经常被访问的数据),allkeys-lru 或 allkeys-lfu 策略更适合,它们会保留这些热点数据。数据经常更新,使用 volatile-lru 或 volatile-lfu 策略更合适,这些策略会考虑数据的过期时间和访问频率。性能优化:在某些情况下,volatile-ttl策略可以帮助优化性能,会优先淘汰剩余生存时间较短的key,从而确保内存中保留更多的有效数据。根据数据被访问的频率来决定哪些数据应该被移除,不关注使用时间,只关注使用频率。
2024-08-06 23:27:53
431
原创 Redis持久化的方式
持久化时将内存数据写入磁盘,指定目录下生成 dump.rdb 文件,重启时通过 dump.rdb 把数据加载到内存,一旦 redis 异常退出会丢失最近一次持久化后更改的数据。Redis 是内存数据库,支持持久化,将内存中的数据些到磁盘中,防止服务器宕机内存数据丢失。AOF可以更好的保护数据不丢失,可以配置 AOF 每秒执行一次fsync操作,如果Redis进程挂掉,最多丢失1秒的数据。以独立日志的方式记录每次写命令,Redis重启时会重新执行AOF文件中的命令达到恢复数据的目的。
2024-07-29 22:26:00
821
原创 什么是分布式事务
是一种业务耦合的设计,消息生产方需要额外建一个事务消息表,并记录消息发送状态,消息消费方需要处理这个消息,并完成自己的业务逻辑,另外会有一个异步机制来定期扫描未完成的消息,确保最终一致性。(1)系统收到下单请求,将订单业务数据存入到订单库中,并且同时存储该订单对应的消息数据,比如购买商品的 ID 和数量,消息数据与订单库为同一库,更新订单和存储消息为一个本地事务,要么都成功,要么都失败。在 2PC 之上扩展的提交协议,主要是为了解决两阶段提交协议的阻塞问题,从原来的两个阶段扩展为三个阶段,增加了超时机制。
2024-07-13 17:46:56
470
原创 MySQL分库分表
本地依赖包,即将分表逻辑写在公共的代码库里,每个需要调用服务的客户方都集成该公共包,就接入了自动分表的能力。可以是服务级别的中间件,有自己独立的进程,通过该进程来调用数据库,这样分表逻辑就是中心化,完全可控的,代理服务就属于这类。数据库数据量增多,数据操作开销变大,物理服务器资源有限,数据量过大产生产生的慢查询会拖累整个服务,可以通过分库分表进行优化。分表逻辑一定是在一个公共,可复用的位置来实现。将一张表的数据,根据场景切分成多张表,可以将长度比较的且不常用的信息,移动到扩展表。1. 分表的实现方式。
2024-07-11 21:43:06
715
原创 MySQL读写分离
读写分离是提升 MySQL 并发的首选方案,当单台 MySQL 无法满足要求时,就只能用多个具有相同数据的 MySQL 实例组成的集群来承担大量的读写请求。把 MySQL 集群拆分成“主 + 从”结构的数据集群,这样才能实现程序上的读写分离,并且 MySQL 集群的主库、从库的数据是通过主从复制实现同步的。
2024-07-10 19:19:20
1239
原创 MySQL架构优化及SQL优化
变更项目的整体架构是性能收益最大的方式。主要涉及两方面,一方面是从整个项目角度,引入一些中间件优化整体性能,另一方面是调整MySQL的部署架构,确保能承载更大的流量访问,提高数据层的整体吞吐。
2024-07-09 23:00:21
1605
原创 MySQL 结构的优化方案
主要是指三方面,即,这些结构如果不合理,在某些场景下也会影响数据库的性能,因此优化时也可以从结构层面出发。一般在项目的库表设计之初就要考虑,当性能瓶颈出现时再调整结构,就为时过晚。
2024-07-05 21:03:11
956
原创 MySQL调优的五个方向
连接层的调优实际上是指调整它的参数,即常驻连接数、最大连接数、空闲连接存活时间以及等待队列的容量。对于最佳连接数的计算,首先要把CPU核数放首位考虑,紧接着是磁盘,最后是网络带宽,因为带宽会影响SQL执行时间,综合考虑后计算出最合适的连接数大小。
2024-07-03 17:34:07
720
原创 MySQL索引怎么优化
用小的数据集去驱动大的数据集,就是先查小表,用小表的结果去大表中检索数据,MySQL的优化器有驱动表的优化,执行多表联查MySQL的关联算法为Nest Loop Join,该算法会依照驱动表的结果集作为循环基础数据,然后通过该结果集中一条条数据,作为过滤条件去下一个表中查询数据,最后合并结果得到最终数据集。每次基于上次返回数据的界限,再一次读取一批数据返回给客户端,也就是经典的分页场景,通过分页的思想能够提升单次查询的速度,以及避免大数据量带来的一系列后患问题。考虑极致的优化,将SQL写成完整的语法。
2024-07-01 15:28:06
1039
原创 MySQL中Explain执行计划各参数的含义
如果包含子查询的查询语句不能够转为对应的semi-join的形式,并且该子查询是不相关子查询,并且查询优化器决定采用将该子查询物化的方案来执行该子查询时,该子查询的第一个SELECT关键字代表的那个查询的select_type就是SUBQUERY。采用物化的方式执行的包含派生表的查询,该派生表对应的子查询的select_type就是DERIVED,从执行计划中可以看出,id为2的记录就代表子查询的执行方式,它的select_type是DERIVED,说明该子查询是以物化的方式执行的。
2024-06-27 19:53:11
1160
原创 MySQL中Slow-log慢查询日志的作用
当一条SQL执行的时间超过规定的阈值后,就会被记录在慢查询日志中,当线上出现响应缓慢的问题时,可以直接通过查看慢查询日志定位问题,再用explain这类工具去生成SQL的执行计划,然后根据生成的执行计划来判断为什么耗时长,是由于没走索引,还是索引失效等情况导致的。项目测试阶段,可以先开启查询日志,然后压测所有业务,紧接着再分析日志中SQL的平均耗时,再根据正常的SQL执行时间,设置一个偏大的慢查询阈值即可(这是个笨办法,如果项目规模较大,直接设置一个大概值,然后上灰度发布,走正式的运营场景效果会更佳)。
2024-06-26 17:47:05
479
原创 MySQL中的Bin-log是什么?有什么作用?
Bin-log日志也被称之为二进制日志,作用与Redo-log类似,主要是,对于select、show这类读操作并不会记录。bin-log是MySQL-Server级别的日志,所有引擎都能用的日志,而redo-log、undo-log都是InnoDB引擎专享的,无法跨引擎生效。bin-log也由内存日志缓冲区+本地磁盘文件两部分组成,也就是:写bin-log日志时,也会先写缓冲区,然后由后台线程去刷盘。
2024-06-25 22:27:59
1669
原创 MySQL中的Redo-log是什么?有什么作用?
用来实现数据的恢复,数据被更新到缓冲区但没刷磁盘,然后MySQL宕机了,MySQL会通过日志恢复数据。
2024-06-24 22:16:36
972
原创 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
1056
原创 什么是悲观锁和乐观锁
有了 CAS,就可以实现一个乐观锁,允许多个线程同时读取(因为根本没有加锁操作),但是只有一个线程可以成功更新数据,并导致其他要更新数据的线程回滚重试。如果一个变量 V 初次读取的时候是 A 值,并且在准备赋值的时候检查到它仍然是 A 值,并不能说明是没有被修改过的,这期间可能被改成了其他值然后又改回成了A, CAS 操作就会误认为它从来没有被修改过。乐观控制相信事务之间的数据竞争(data race)的概率是比较小的,因此尽可能直接做下去,直到提交的时候才去锁定,所以不会产生任何锁和死锁。
2024-05-19 19:49:16
654
原创 什么是死锁以及怎么解决死锁
默认情况下监控是关闭的,只有当需要分析问题时再开启,并且在分析问题之后,建议将监控关闭,因为它对数据库的性能有一定影响,另外每 15 秒输出一次日志,会使日志文件变得特别大。在工作过程中偶尔会遇到死锁问题,对于 MySQL 的 InnoDb 存储引擎来说,死锁问题是避免不了的,没有哪种解决方案可以说完全解决死锁问题,但是可以通过一些可控的手段,降低出现死锁的概率。要获取死锁日志,需要开启 InnoDb 的标准监控,推荐将锁监控也打开,它可以提供一些额外的锁信息,在分析死锁问题时会很有用。
2024-05-18 19:24:12
1194
原创 事务隔离级别有哪些?怎么实现的?
对于当前读,如果事务开启后,并没有执行当前读,而是先快照读,然后这期间如果其他事务插入了一条记录,那么事务后续使用当前读进行查询的时候,就会发现两次查询的记录条目就不一样了,所以就发生幻读。启动两个事务,A和B,当前有一条记录,事务B读取了这条记录,该记录的事务id比当前数据库中活跃事务的最小值还小,说明是在事务B启动前就提交了,所以能够查询到。事务A提交事务后,当前隔离级别是可重复读,事务B在读取记录时,还是基于启动事务时的Read View,所以读取的数据依然是事务A修改前的数据。
2024-05-16 21:33:52
1243
原创 MySQL是如何选择索引的?
在电商业务中会有一个这样的逻辑:会定期扫描支付状态为支付中的订单,然后强制让其关闭,从而释放库存,给其他有需求的买家进行购买。优化器认为一条 SQL 需要创建基于磁盘的临时表,这时的成本是最大的,索引键值的比较、记录之间的比较,其实开销是非常低的,但如果要比较的记录数非常多,则成本会变得非常大。例如支付状态只有已完成、支付中、超时已关闭三种,有一百万条数据,优化器会认为每个状态占用三分之一数据,使用全表扫描,避免二级索引回表效率会更高。在有些低选择性的列上,是有必要创建索引的。比如电商的核心业务表。
2024-05-15 17:54:25
698
原创 什么情况下会造成索引失效?
在 WHERE 子句中,如果在 OR 前的条件列是索引列,而在 OR 后的条件列不是索引列,那么索引会失效。因为索引保存的是索引字段的原始值,而不是 id + 1 表达式计算后的值,所以无法走索引,只能通过把索引字段的取值都取出来,然后依次进行表达式的计算来进行条件判断,因此采用的就是全表扫描的方式。MySQL 5.7 开始,索引特性增加了函数索引,即可以针对函数计算后的值建立一个索引,也就是说该索引的值是函数计算后的值,所以就可以通过扫描索引来查询数据。查询条件中对索引字段使用函数,就会导致索引失效。
2024-05-14 21:05:16
928
原创 MySQL索引的存储结构
索引组织表中数据是根据主键顺序存放在索引中的,即使数据发生了位置变更,主键索引会自动调整数据记录的位置,非主键索引也会根据主键的变化而自动更新。数据和索引是分开存放的,索引是排序后的,但堆数据是无序的进行的都是随机访问,索引的叶子节点中存放的是数据在堆表中的地址,堆表的数据发生改变且位置也发生变更,所有索引中的地址也要更新,非常影响性能。二级索引的好处就是,如果当前字段的值发生改变了,只修改当前字段的二级索引,其他的二级索引不需要更新,除非是对应的主键值也被更新了。,存放的是索引键值和主键值。
2024-05-13 19:19:22
663
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
784
2
原创 MySQL中怎么存放一条记录
MySQL 中磁盘和内存交互的基本单位是页,一个页的大小一般是 16KB,也就是 16384字节,一个 varchar(n) 类型的列最多可以存储 65532字节,一些大对象如 TEXT、BLOB 可能存储更多的数据,这时一个页可能就存不了一条记录。InnoDB 的数据是按「页」为单位来读写的,每个页默认空间大小是16kb,是InnoDB 存储引擎磁盘管理的最小单元,常见的有数据页、undo 日志页、溢出页等等,行记录是用数据页管理的。二进制位的值是1时,表示该字段是NULL,为0表示不为NULL。
2024-04-30 20:16:25
1259
原创 MySQL中SELECT语句的执行过程
使用组合索引时,可能会有部分字段无法使用到索引,这时可以使用索引下推来减少回表操作,索引下推就是将所有查询条件都判断完成后再回表,没有使用索引下推就只判断了使用到索引的字段,其余字段的查询条件还需要回到Server层来判断。组合索引当遇到范围查询 (>、<) 就会停止匹配,也就是。
2024-04-29 16:23:48
2959
2
原创 二级索引为什么能直接从叶子节点获取获取数据?
当你执行这个查询时,数据库系统可以直接从索引的叶子节点中获取到需要的字段值,因为索引叶子节点中已经存储了主键值,数据库系统可以利用这些主键值直接访问主键索引或数据页,而不需要回表到原始数据表。在覆盖索引的情况下,二级索引的叶子节点存放的确实是主键索引键值和主键值,而不是完整的数据行。就是因为我们查询需要的字段不在索引中,那么数据库无法直接从索引中获取所有我们需要的数据,这样的数据是不完整的,因此需要回表到原始数据表中获取额外的数据字段。今天在看索引覆盖的时候,看到了这么一句话。
2024-04-28 22:41:20
433
原创 MySQL中的索引及怎么使用
如果定义了主键,MySQL 会使用主键作为聚集索引,如果没有主键,会使用第一个所有值都是NOT NULL的UNIQUE索引作为聚集索引。定义多字段索引时,应将 WHERE 子句中常用的字段放在索引列表的开头,将不常用的列放在索引列列表的后面。聚集索引是一种特殊的索引,索引中键值的顺序决定了表中相应行的物理顺序。相比为整个字符串列创建索引,前缀索引能减少磁盘的使用量,提高索引的写入速度。MySQL 唯一索引是一种特殊的索引,它不但可以加快从表中检索数据的速度,还能防止在指定的一个或多个列中出现重复值。
2024-04-28 15:55:05
3350
原创 讲清楚MySQL主键和外键
一般类型设为 INT(最大可表示2亿,一般足够了,要根据具体的需求决定),设为主键后自动变为不可为空,另外还要设定 AI(Auto Incremental)自动递增,这样会方便许多,不需要担心主键唯一性的问题。RESTRICT: 如果被引用的表中的一行在该表中有匹配的行,试图删除或更新被引用的表中行时会引发 MySQL 错误。SET NULL:如果被引用的表中的一行被删除或更新,该表中匹配行的值设置为 NULL。CASCADE:如果被引用的表中的一行被删除或更新,该表中匹配行的值会。1.7. 主键和外键。
2024-04-27 17:02:40
1150
1
原创 MySQL中的数据类型及一些应用场景
使用能满足你需求的最小整数类型,如储存人的年龄用 UNSIGNED TINYINT 就足够了,至少可见的未来内没人能活过255岁,因为数据需要在磁盘和内存间传输,虽然不同类型间只有几个字节的差异,但数据量大了以后对空间和查询效率的影响就很大了,所以在数据量较大时,有意识地分配每一字节,保持数据最小化是很有必要的。超出部分如果是空格会截断,不是空格会报错。例如,当前数据库记录存储的长度不一致,当记录4更新后数据长度增加了,原先的空间无法容纳更新后的记录了,会将记录4删除再寻找新的空间给记录4使用。
2024-04-26 19:01:32
1518
原创 什么是事务和并发
现在有两个会话(注意是两个链接(connection),而不是同一个会话下的两个SQL标签,这两个链接相当于是在模拟两个用户)都要执行这段语句,用调试逐句执行, 当第一个执行到UPDATE 而还没有 COMMIT 提交时,转到第二个会话,执行到UPDATE语句时会一直等待执行(若等的时间太久会超时而放弃执行),这时跳回第一个对话 COMMIT 提交,第二个会话的 UDDATE 才执行成功,最后将第二段对话的事务也COMMIT提交,此时刷新顾客表会发现1号顾客的积分多了20分。换成 ROLLBACK;
2024-04-25 18:41:03
1357
原创 MySQL子查询的用法及原理
不仅 WHERE 筛选条件里可以用子查询,SELECT 选择子句和 FROM 来源表子句也能用子查询,简单讲就是,SELECT选择语句是用来确定查询结果包含哪些字段,每个字段都可以是一个表达式,而每个字段表达式里的元素除了可以是原始的列,具体的数值,也同样可以是其它各种子查询的结果。之前都是非关联主/子(外/内)查询,比如子查询先查出整体的某平均值或满足某些条件的一列id,作为主查询的筛选依据,这种子查询与主查询无关,会先一次性得出查询结果再返回给主查询供其使用。子查询的层级用括号实现。
2024-04-24 18:09:39
1518
原创 MySQL如何进行增删改操作
如果不需要全部的数据,就选用原表中部分数据创建副本表,如,用今年以前的 orders 创建一个副本表 orders_archived,其实就是在子查询里增加了一个WHERE orders<今年时间的 语句进行筛选。对于AI (Auto Incremental 自动递增) 的id字段,MySQL会记住删除的/用过的id,并在此基础上递增——目前有10条数据,删除了最后两条数据再进行插入数据后,会在10的基础上递增。INSERT INTO 表名 子查询 很常用,子查询替代原先插入语句中 VALUES(……
2024-04-23 18:24:31
732
原创 MySQL多表查询操作的一写关键字
说明:这样是INNER JOIN,只展示有订单的顾客(及其订单),也就是两张表的交集(没订单的顾客不会显示),但注意这里因为一个顾客可能有多个订单,所以INNER JOIN以后顾客信息其实是是广播了的,即一条顾客信息被多条订单记录共用,当然 这叫。如下面的例子,员工的上级也是员工,所以也在员工表里,想得到员工和他的上级信息的合并表,就要员工表自己和自己合并,如果上级是老板没有上级了也需要显示出来,作为合并条件(join condition)的字段在两个表中有相同的字段名时,可用 USING (……
2024-04-22 22:26:53
2343
原创 Java Web 应用程序的资源文件存放位置
后来查了一下Content root 和source root的区别 "Content root" 是项目根目录,而 "Source root" 是源代码根目录。今天在写苍穹外卖时需要读一个表格,然后把营业额数据写到这个表格中,这个表格我就随手拖到根目录了。:项目的根目录,包含项目的所有内容,包括源代码、资源文件、配置文件等。大多数情况下,内容根目录也是源代码根目录,但它还包含其他项目文件。通常,源代码根目录下的文件和文件夹包含项目的源代码文件。源代码根目录可能包含资源文件,如静态页面、样式表等。
2024-04-19 22:50:24
834
原创 动态代理的原理及执行流程
用一个具体的例子来说明一下,你有一家目标公司你想去这家公司上班,你不能直接联系到老板就需要通过HR来进入到这家公司。你和目标公司都是明确的,HR就是代理对象。哪什么是动态代理呢?:类加载器。指定了用于加载动态代理类的类加载器。动态代理类是在运行时生成的,因此需要一个类加载器来加载它。Class
2024-04-19 12:58:00
834
原创 entity,vo,dto,是什么?有什么区别
实体通常指的是表示业务概念或对象的对象模型,被映射到数据库表中,用于持久化数据。实体通常包含属性和方法来描述其行为和状态。例如,在一个图书馆管理系统中,书籍可以是一个实体,它可能具有属性如书名、作者、出版日期等。:值对象是一个简单的数据对象,其主要作用是封装一组相关的数据,并且通常是不可变的。值对象的主要特点是它们的相等性通常由其属性决定,而不是由标识符决定。在一些领域驱动设计(DDD)中,值对象用于表示概念上的值,例如日期范围、货币金额等。值对象通常不具有行为,而仅仅是一组数据的容器。
2024-04-17 00:07:58
1820
原创 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
842
原创 什么是Redis?
Redis是一个基于的key-value结构数据库。Redis 是互联网技术领域使用最为广泛的。官方提供的数据是可以达到的QPS(每秒内查询次数)。能够存储的value类型比较丰富,也被称为结构化的(Not Only SQL)数据库。不仅仅是SQL,泛指。NoSql数据库并不取代关系型数据库,而是关系型数据库的补充。
2024-04-15 00:18:39
442
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人