- 博客(132)
- 资源 (4)
- 收藏
- 关注
原创 【MySQL 数据宝典】【事务&锁】- 002 事务控制的演进
MySQL中实现MVCC(多版本并发控制)的机制主要基于undo log多版本链和ReadView机制。通过undo log多版本链和ReadView机制的结合,MySQL实现了MVCC机制,确保了数据库在并发操作下的一致性和隔离性。
2024-05-11 14:05:05
716
原创 【MySQL 数据宝典】【事务&锁】- 001 ACID特性介绍
未提交事务,写入后崩溃:程序还没修改完三个数据,但数据库已经将其中一个或两个数据的变动写入磁盘,此时出现崩溃,一旦重启之后,数据库必须要有办法得知崩溃前发生过一次不完整的购物操作,将已经修改过的数据从磁盘中恢复成没有改过的样子,以保证原子性。已提交事务,写入前崩溃:程序已经修改完三个数据,但数据库还未将全部三个数据的变动都写入到磁盘,此时出现崩溃,一旦重启之后,数据库必须要有办法得知崩溃前发生过一次完整的购物操作,将还没来得及写入磁盘的那部分数据重新写入,以保证持久性。
2024-05-10 17:38:44
1146
原创 【MySQL 数据宝典】【索引原理】- 008 数据库优化基本思路
哪些数据不适合放在数据库中1. 二进制数据;2. 流水队列数据;3. 超大文本;
2024-05-10 17:35:59
838
原创 【MySQL 数据宝典】【索引原理】- 007 索引优化示例
下面是一张用户通讯表的表结构信息,这张表来源于真实企业的实际项目中,有接近500万条数据.
2024-05-09 14:55:54
651
2
原创 【MySQL 数据宝典】【索引原理】- 006 慢查询日志分析&优化
日志记录到系统的专用日志表中,要比记录到文件耗费更多的系统资源,因此对于需要启用慢查询日志,又需要能够获得更高的系统性能,那么建议优先记录到文件.例如,嵌套循环中,如果小的循环在外层,则数据库连接只会发生5次,进行5000次操作,相比之下,如果大的循环在外层,则会导致1000次数据库连接,增加资源消耗。排序操作较为常见,如果排序字段在索引中,速度会更快,因为索引本身就是排好序的。如下图是慢日志里其中一条SQL的记录内容,可以看到有时间戳,用户,查询时长及具体的SQL等信息.如何选择合适的索引?
2024-04-28 10:10:15
1196
原创 【MySQL 数据宝典】【索引原理】- 005 一文说明白 OrderBy 优化
如果 MySQL 认为内存足够大,会优先选择全字段排序,把需要的字段都放到 sort_buffer中, 这样排序后就会直接从内存里面返回查询结果了,不用再回到原表去取数据。MySQL 的一个设计思想:如果内存够,就要多利用内存,尽量减少磁盘访问。对于 InnoDB 表来说,rowid 排序会要求回表多造成磁盘读,因此不会被优先选择。
2024-04-28 10:09:16
636
原创 【MySQL 数据宝典】【索引原理】- 004 优化示例-join & in &exist
多表关联查询时,第一个被处理的表就是驱动表,使用驱动表去关联其他表.驱动表的确定非常的关键,会直接影响多表关联的顺序,也决定后续关联查询的性能永远用小结果集驱动大结果集(其本质就是减少外层循环的数据数量)为匹配的条件增加索引(减少内层表的循环匹配次数)增大join buffer size的大小(一次缓存的数据越多,那么内层包的扫表次数就越少)减少不必要的字段查询(字段越少,join buffer 所缓存的数据就越多。
2024-04-28 09:56:40
1172
1
原创 【MySQL 数据宝典】【索引原理】- 003 用例子说明索引优化基础原则
最左前缀法则要遵守索引列上不计算范围之后全失效覆盖索引记住用。不等于、is null、is not null、or导致索引失效。like百分号加右边,加左边导致索引失效,解决方法:使用覆盖索引。
2024-04-28 09:54:27
684
原创 【MySQL 数据宝典】【索引原理】- 002 示例+逐个字段学明白 Explain
type类型解释system不进行磁盘IO,查询系统表,仅仅返回一条数据const查找主键索引,最多返回1条或0条数据. 属于精确查找eq_ref查找唯一性索引,返回数据最多一条, 属于精确查找ref查找非唯一性索引,返回匹配某一条件的多条数据,属于精确查找,数据返回可能是多条.range查找某个索引的部分索引,只检索给定范围的行,属于范围查找. 比如: > 、 < 、in 、betweenindex查找所有索引树,比ALL快一些,因为索引文件要比数据文件小.ALL。
2024-04-26 10:27:14
1284
原创 【MySQL 数据宝典】【索引原理】- 001 索引原理分析 (AVL树、B-Tree、B+Tree)
B-Tree是一种平衡的多路查找树,B树允许一个节点存放多个数据. 这样可以在尽可能减少树的深度的同时,存放更多的数据(把瘦高的树变的矮胖)B-Tree中所有节点的子树个数的最大值称为B-Tree的阶,用m表示.一颗m阶的B树,如果不为空,就必须满足以下条件.m阶的B-Tree满足以下条件:每个节点最多拥有m-1个关键字(根节点除外),也就是m个子树根节点至少有两个子树(可以没有子树,有就必须是两个)分支节点至少有(m/2)颗子树 (除去根节点和叶子节点其他都是分支节点)
2024-04-26 10:24:52
654
原创 【MySQL 数据宝典】【存储引擎】- InnoDB 常用参数的优化技巧
一个大的日志缓冲区允许大量的事务在提交之前不写日志到磁盘。因此,如果你有很多事务的更新,插入或删除操作,通过设置这个参数会大量的减少磁盘I/O的次数数。建议: 在专用数据库服务器上,可以将缓冲池大小设置为服务器物理内存的60% - 80%.监控在线调整缓冲池的进度。
2024-04-24 11:08:56
1384
原创 【MySQL 数据宝典】【磁盘结构】- InnoDb 数据文件-Page结构、行记录格式
服务器为了描述一条记录而添加了一些额外信息(元数据信息),这些额外信息分为3类,分别是: 变长字段长度列表、NULL值列表和记录头信息.
2024-04-24 10:54:56
839
原创 【MySQL 数据宝典】【线程模型】-IO Thread、Puge Thread介绍
通过异步IO,InnoDB能够在进行IO操作时不阻塞其他线程的执行,从而更高效地处理读写请求。作用是将脏数据刷新到磁盘,脏数据刷盘后相应的redo log也就可以覆盖,即可以同步数据,又能达到redo log循环使用的目的。InnoDB的Master Thread是主线程,担负着调度其他各个线程的重要任务,其优先级最高。而在后续版本中,read thread和write thread分别增大到了4个,总共有10个IO线程。,该命令将显示当前InnoDB引擎的详细状态信息,包括IO线程的数量和状态等。
2024-04-23 09:54:37
1007
原创 【MySQL 数据宝典】【磁盘结构】- 006 bin log 二进制日志的基本模式和参数设置
binlog是一个二进制格式的文件,用于记录语句信息,例如更改数据库表和更改内容的SQL语句都会记录到binlog里,但是不会记录SELECT和SHOW这类操作。
2024-04-23 09:45:29
1188
原创 【MySQL 数据宝典】【磁盘结构】- 005 Undo log 撤销日志
提供回滚操作Undo Log实现了事务的原子性。在数据修改时,除了记录redo log外,还记录了相应的undo log。如果事务执行失败,可以利用undo log进行回滚。Undo Log是逻辑日志,记录了数据修改的逻辑操作,如delete操作对应的是insert操作,update操作对应相反的update操作。提供多版本控制(MVCC)MVCC通过Undo Log实现。当某行数据被其他事务锁定时,可以从undo log中获取该行记录之前的数据版本,从而实现了快照读。
2024-04-22 10:29:17
794
原创 【MySQL 数据宝典】【磁盘结构】- 004 redolog 重做日志
Redo log 记录了事务对数据库做了哪些修改,属于物理日志,包括不同类型的日志记录,如 MLOG_1BYTE、MLOG_2BYTE、MLOG_4BYTE、MLOG_8BYTE 和 MLOG_WRITE_STRING。InnoDB 引擎对数据的更新,是先将更新记录写入 redo log 日志,然后在系统空闲的时候或者是按照设定的更新策略再将日志中的内容更新到磁盘之中。MySQL会根据自身的策略将内存中的数据页刷新到磁盘,这个过程可能会在事务提交后的某个时间点发生。也写满时,会再切换到重做。
2024-04-22 10:12:44
1038
原创 【MySQL 数据宝典】【磁盘结构】- 003 双写缓冲区
这样在宕机重启时,即使发生数据页损坏,可以通过该页的副本来还原该页,然后再进行redo log重做,确保了数据页的可靠性。为了解决写失效问题,InnoDB实现了双写缓冲区,它位于系统表空间,是一个存储区域。双写缓冲区在写入过程中发生了宕机,数据页仍然有可能丢失。双写缓冲区的设计是为了。为啥写两次,刷一次数据文件保存数据不就可以了,为什么还要写共享表空间?默认情况下启用双写缓冲区,可以通过将。,但并不能完全消除它。
2024-04-19 09:49:48
587
原创 【MySQL 数据宝典】【磁盘结构】- 002 数据字典
我们平时使用 INSERT 语句向表中插入的那些记录称之为用户数据,MySQL只是作为一个软件来为我们来保管这 些数据,提供方便的增删改查接口而已。但是每当我们向一个表中插入一条记录的时候,MySQL先要校验一下插 入语句对应的表存不存在,插入的列和表中的列是否符合,如果语法没有问题的话,还需要知道该表的聚簇索引 和所有二级索引对应的根页面是哪个表空间的哪个页面,然后把记录插入对应索引的 B+ 树中。
2024-04-19 09:47:37
694
原创 【MySQL 数据宝典】【磁盘结构】- 001 表空间介绍&优化建议
Log Buffer:日志缓冲区,用来保存要写入磁盘上log文件(Redo/Undo)的数据,日志缓冲区的内容定期刷新到磁盘log文件中。日志缓冲区满时会自动将其刷新到磁盘,当遇到BLOB或多行更新的大事务操作时,增加日志缓冲区可以节省磁盘I/O。LogBuffer空间满了,会自动写入磁盘。可以通过将innodb_log_buffer_size参数调大,减少磁盘IO频率。LogBuffer主要作用是: 用来优化每次更新操作之后都要写入redo log 而产生的磁盘IO问题.
2024-04-18 15:46:49
1254
原创 【MySQL 数据宝典】【内存结构】- 005 Log Buffer
Log Buffer:日志缓冲区,用来保存要写入磁盘上log文件(Redo/Undo)的数据,日志缓冲区的内容定期刷新到磁盘log文件中。日志缓冲区满时会自动将其刷新到磁盘,当遇到BLOB或多行更新的大事务操作时,增加日志缓冲区可以节省磁盘I/O。LogBuffer空间满了,会自动写入磁盘。可以通过将innodb_log_buffer_size参数调大,减少磁盘IO频率。LogBuffer主要作用是: 用来优化每次更新操作之后都要写入redo log 而产生的磁盘IO问题.
2024-04-18 15:38:21
218
原创 【MySQL 数据宝典】【内存结构】- 004 自适应哈希索引
自适应哈希索引是MySQL InnoDB存储引擎中的一种索引结构,用于加速查询。它根据查询模式和数据分布动态地调整自身的大小,以提高性能。上图就是通过自适应哈希索引降低寻址的开销。
2024-04-18 15:34:26
338
原创 【MySQL 数据宝典】【内存结构】- 003 Change Buffer 详解
Change Buffer:写缓冲区,是针对页的更新优化措施。作用: 在进行DML操作时,如果请求的是 辅助索引(非唯一键索引)没有在缓冲池 中时,并不会立刻将磁盘页加载到缓冲池,而是在CB记录缓冲变更,等未来数据被读取时,再将数据合并恢复到BP中。ChangeBuffer占用BufferPool空间,默认占25%,最大允许占50%,可以根据读写 业务量来进行调整。参数innodb_change_buffer_max_size;
2024-04-18 09:55:27
1247
原创 【MySQL 数据宝典】【内存结构】- 002 Page管理机制
Buffer Pool 的底层采用链表数据结构管理Page。在InnoDB访问表记录和索引时会在Page页中缓存,以后使用可以减少磁盘IO操作,提升效率。
2024-04-17 21:24:08
1001
原创 【MySQL 数据宝典】【内存结构】- 001 BufferPool
Buffer Pool 是 InnoDB 存储引擎用于缓存磁盘中页的内存区域,它的大小直接影响数据库的性能。默认情况下,Buffer Pool 的大小为 128MB,但可以根据服务器配置和需求进行调整。通过设置 MySQL 服务器配置文件中的参数来指定 Buffer Pool 的大小。举例:如果服务器有 512GB 内存,可以将数百GB分配给 Buffer Pool,以提高数据库读取性能。可在配置文件中设置参数,单位为字节。例如:[server][server]单位是字节。
2024-04-17 09:56:54
1236
原创 【Redis 神秘大陆】009 案例实践&进阶
- **适用场景**:缓存其他系统的数据、缓存空间有限、低频热点缓存等场景。- **思路**:采用懒加载方式,即首先读取缓存,若不命中则查询数据,然后异步写入缓存并设置过期时间,下次读取将命中缓存。- **注意事项**:- 针对热点数据,可在应用系统上设置较短的缓存时间。- 数据可能存在一段时间的不一致情况,需要根据场景来决定如何设置过期时间。- **应用场景示例**:库存数据
2024-04-16 14:21:23
1343
1
原创 【Redis 神秘大陆】008 常见Java客户端
连接池里面放置的是空闲连接,如果被使用 (borrow)掉,连接池就会少一个连接,连接使用完后进行放回 (return),连接池会增加一个可用连接。如果没有可用连接,便会新建连接。
2024-04-16 14:14:14
1042
原创 【Redis 神秘大陆】006 灾备方案
volatile-lru(默认):从已设置过期时间(Expire)的Key中,删除最近最少使用的Key(LRU算法),且不会考虑Key是否已经过期。volatile-lfu:从已设置过期时间(Expire)的Key中,删除最不常用的Key(LFU算法)。volatile-random:从已设置过期时间(Expire)的Key中,随机删除一些Key。volatile-ttl:从已设置过期时间(Expire)的Key中,根据存活时间(TTL)从小到大排序进行删除。
2024-04-16 14:10:43
1002
原创 【Redis 神秘大陆】005 常见性能优化方式
将商品数据按照不同维度进行拆分,并对每个维度进行缓存。对于商品变更,只更新变更的部分数据,而不是整个商品数据。对于频繁变更的维度,如上下架状态,通过维度化缓存可以减少服务压力。
2024-04-16 14:09:45
1127
原创 【Redis 神秘大陆】004 高可用集群
分布式系统本质是通过低廉的硬件攒在一起以获得更好的吞吐量、性能以及可用性等。一台设备坏了,可以通过负载均衡和路由到 其他设备上。分布式系统设计有核心四大块:心跳检测: 如何检测你还活着?【注册中心】高可用设计: 如何保证高可用容错性: 服务容错如何处理、怎么做重试负载均衡: 负载均衡策略怎么处理。
2024-04-16 14:08:05
1143
原创 【Redis 神秘大陆】003 数据类型&使用场景
通过 Redis 实现对特定操作的限速,如限制用户获取验证码的频率、限制 IP 地址的访问频率等。示例代码如下:
2024-04-16 14:04:43
928
原创 【Redis 神秘大陆】002 简介&特性
为什么单线程这么快1. **纯内存访问:** Redis将所有数据存储在内存中,内存的访问速度非常快,大约在100纳秒左右。这使得Redis能够达到每秒万级别的访问速度。
2024-04-16 14:03:13
880
原创 rsync - inflate returned -3 (0 bytes) 报错
传输的命令如下nohup rsync -vzrtopgP rsync_backup@xxx::mysql-data /home/xxx/data/mysqldata --password-file=/etc/rsync.password --inplace 2>&1 >/home/xx/data/xx.transferData.log &今天使用rsync来传输数据传输了一般,就发现了这个报错inflate returned -3 (0 bytes)rsync
2021-03-17 12:31:31
718
1
原创 Mybatis-应用分析和最佳实践2
Mybatis应用分析和最佳实践 以下是一些 MyBatis 的高级用法或者扩展方式,帮助我们更好地使用 MyBatis。为什么要动态SQL 避免因为前端传入的查询参数不同,所以导致写很多的if else,还需要非常注意SQL语句中的and,空格,逗号和转义的单引号,拼接和调试sql非常耗时。 Mybatis的动态SQL就解决了这个问题,其是基于OGNL表达式的。动态标签if<select id="findActiveBlogWithTitleLike&
2021-01-17 10:48:36
399
原创 Mybatis-应用分析和最佳实践-核心配置
为什么要用Mybatis代码重复结果集处理太复杂连接管理常见的工具DbUtils数据源的支持QueryRunner直接使用QueryRunner来查询提供了Resulthandler通过反射来做属性的映射JDBCTemplate提供了数据源的支持RowMapper来使用结果的处理RowMapper提供泛型,避免每次创建对应的实现类mapRow上述没有解决的问题直接把SQL写在了代码里面条件只能按照顺序传入没有实现实体类到数据库记录的映射
2021-01-16 16:22:33
264
原创 设计模式-命令模式
命令模式定义命令封装每一个命令是一个操作解耦请求方和接收方请求方只需要请求执行命令,不需要关心命令是怎么被接受,操作和是否被执行行为型模式生活中的场景遥控器餐厅点菜把需求和执行解耦适用场景现实语义中具备命令的操作shell命令命令菜单调用者和请求的接受者需要解耦调用者不需要关心具体命令的执行细节,只需要把对应的命令传递出去就行了需要抽象出等待执行的行为撤销恢复等操作需要支持命令宏命令组合操作shell 中的help命令通用类图
2021-01-09 00:44:48
154
原创 设计模式-迭代器模式
迭代器模式定义迭代器模式又称为游标模式它提供一种方法访问一个容器对象中各个元素,而又不需暴露该对象的内部细节本质什么是容器,能够容纳对象的所有类型的都可以称为容器Collection集合类型Set类型等抽离集合对象迭代行为到迭代器中,提供一致的访问接口组合模式也是为了提供一致的访问接口,关心整体和个体一致属于行为型模式生活中的例子快递迭代分发刷脸刷票进展适用场景访问一个集合对象的内容不需要暴露他的内部表示为遍历不同的集合结构提供统一的方式通用结构
2021-01-09 00:31:05
110
原创 设计模式-责任链模式
责任链模式定义把链中每一个节点看做一个对象,每个节点处理的请求都不一样。内部自动维护一个下一个节点对象。当一个请求从链的请求首段发出的时候,会沿着链的路径一次传递给每一个节点对象,直到某个对象就结束。行为模式生活中的场景生活中的审批流程部门的申请适用场景多个对象可以处理同一个请求,单具体由那个对象处理则在运动时动态决定在不明白知道你个接受者的情况下,向多个对象中的一个提交一个请求可以动态指定一组对象处理请求通用类图可以看到责任链主要包含两种角色:Handler抽象
2021-01-07 20:44:05
167
原创 设计模式-策略模式
策略模式 能够帮助我们消除程序中大量的if else 和switch语句 能够消除程序中大量冗余代码和多重条件转移语句 是指定义了算法家族,分别封装起来,让他们之间可以相互替换,此模式让算法的变化不会影响到使用算法的用户。通用类图Context上下文角色用来操作策略的上下文环境,屏蔽高层模块对策略,算法的直接访问,封装可能存在的变化抽象策略角色Strategy规定策略或者算法的行为具体策略角色ConcreteStrategy具体的策略或者算法实现
2021-01-07 19:56:43
149
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人