![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据库
文章平均质量分 54
super_dmz
这个作者很懒,什么都没留下…
展开
-
缓存与数据库内容不一致问题应如何解决
待完成原创 2022-01-12 16:34:12 · 425 阅读 · 0 评论 -
数据库优化
两个表连接方式:外连接、内连接左表为驱动表,右表为被驱动表最原始的join方式:1、采用一定方式获取左表需要的内容2、对于每条记录遍历被驱动表,寻找匹配的数据(需要重复IO读取多次被驱动表)减少join成本的基本方式:1、采用一定方式获取左表需要的内容2、采用join buffer,同时缓存多条驱动表的数据,这样读取一次被驱动表可以与多条驱动表数据进行匹配,减少了IO成本3、读取被驱动表数据时采用合适的索引方式进行检索...原创 2021-12-07 16:48:02 · 569 阅读 · 0 评论 -
分布式计算细节
一、如何将分布式计算表的数据映射到分布式KV存储引擎分布式系统里最核心的两个部分就是分布式计算和分布式存储。对于一个分布式数据库而言,一般将计算的sql layer置于分布式存储的kv之上,示意图如下:分布式数据库一般同样支持sql语法,但实现逻辑大不一样。mysql一般直接将数据按照行记录格式进行存储,每一个索引也是直接对应一个文件。而分布式数据库则会将每一个行记录或索引拆分出来,按照key-value的形式在kv存储引擎进行存储。转换规则如下所示:又或者这样: .原创 2021-11-30 18:14:29 · 931 阅读 · 0 评论 -
乐观锁,悲观锁与MVCC
发生冲突的情况在数据库中,并发控制是指在多个用户/进程/线程同时对数据库进行操作时,如何保证事务的一致性和隔离性的,同时最大程度地并发。当多个用户/进程/线程同时对数据库进行操作时,会出现3种冲突情形:读-读,不存在任何问题 读-写,有隔离性问题,可能遇到脏读(会读到未提交的数据) ,幻影读等。 写-写,可能丢失更新加锁可以解决全部的问题(可以理解为通过加锁让程序执行往串行化发展),但是极度影响执行效率。因此开始寻求不用锁来解决冲突的方法。MVCC的作用MVCC主要用于处理读—原创 2021-10-19 19:22:26 · 181 阅读 · 0 评论 -
一些有意思的设计技巧
1、写实复制fork后子进程和父进程共享内存,直到子进程产生写操作时才开始创建数据副本,分开处理2、隐式锁使用事务号来减少必须生成锁的情况以及生成锁的时间3、redis rehashredis可能保存大量数据,内存不够进行迁移时一次全腾过去会很浪费CPU时间;因此选择使用渐进式rehash,每次crud数据时把ht[0]对应的一小部分数据挪到ht[1],分批处理...原创 2021-10-17 11:46:57 · 50 阅读 · 0 评论 -
数据库中的锁问题
前言本博客主要是对《MySQL是怎样运行的》一书的内容进行整理,另外添加了自己对于锁机制与MVCC机制之间应用场景和作用的辨析以及解决幻读的方法的总结锁机制和MVCC机制的辨析MVCC机制主要用于处理读——写之间的冲突,因此MVCC能处理脏读、不可重复读以及快照读的幻读问题;锁机制主要用于处理写——写之间的冲突,锁机制用于处理脏写问题(脏写一般都是通过加锁来处理),另外锁机制还用于处理当前读的幻读问题。使用锁可以解决脏写、脏读、不可重复读、幻读这四个问题,但是问题在于锁机制的性能较差原创 2021-10-14 17:23:13 · 284 阅读 · 0 评论 -
MVCC依然可以产生幻读的原因
不同引擎mvcc实现不一样。以innodb为例的话,mvcc本身是通过trx_id(事务隐藏列)来实现的版本维护,不能读取到ReadView开启时还没提交的事务的记录。mysql里面实际上有两种读,一种是“快照读”,比如我们使用select进行查询,就是快照读。在快照读的情况下不会产生幻读的问题。另一种读则是“当前读”,例如delete,update,insert等语句,都需要满足直接忽略事务号读取最新数据的要求。否则可能产生下述情况:在执行这几个操作时会读取最新的记录,即使是别的事务提交原创 2021-10-14 15:23:40 · 482 阅读 · 0 评论 -
事务隔离级别和MVCC
前言本博客主要是对《MySQL是怎样运行的》一书的内容进行整理第21章 事务隔离级别和MVCC我们希望让不同的事务“隔离”地执行,互不干涉。这也就是事务的隔离性。串行执行过于严格,会严重降低系统吞吐量和资源利用率,增加事务的等待时间,因此需要采用其他机制来保证并发执行的事务的执行结果与串行执行的结果一样。两个并发的事务在执行过程中访问相同数据的情况有四种:读——读,读——写,写——读,——写——写。只有在至少一个事务对数据进行写操作时,才可能带来一致性问题。这一致性通常通过加锁来原创 2021-10-14 12:29:06 · 274 阅读 · 0 评论 -
数据库事务简介
前言本博客主要是对《MySQL是怎样运行的》一书的内容进行整理第18章 事务简介事务的四个特性ACID:原子性,一致性,隔离性,持久性原子性在任何一个可能的时间点都可能发生意想不到的多无(数据库本身的错误、操作系统的问题甚至直接断电)而使操作执行不下去。因此需要添加原子性的限制,“要么全做,要么全不做”。如果在执行操作的过程中发生了错误,就把已经执行的操作恢复成没执行之前的样子。隔离性不仅要保证事务的操作以原子性的方式执行完成,还要保证其他的状态转换不会影响本次的原创 2021-10-13 18:45:16 · 76 阅读 · 0 评论 -
B+树索引
前言本博客主要是对《MySQL是怎样运行的》一书的内容进行整理第六章 B+树索引数据库中,各个数据页可以组成一个双向链表,而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表。可以通过数据页的页目录寻找对应的槽,通过槽使用二分法快速查找到对应的信息。查找信息流程1、定位到记录所在的页2、从所在的页内查找相应的记录一个简单的索引方案新分配的数据页编号可能并不是连续的,也就是说我们使用的这些页在磁盘上可能并不挨着1、下一个数据页中数据主键的大小必须大原创 2021-10-12 13:02:01 · 3092 阅读 · 0 评论 -
InnoDB数据库存储结构
前三章内容MySQL一定要注意字符集的格式和比较规则,否则在传入中文或者其他内容时可能会出现异常第四章 InnoDB记录存储结构Innodb是一个将表中数据存储在磁盘上的存储引擎,但是真正处理数据的过程则是发生在内存中,因此需要把磁盘中的数据加载到内存中,处理完毕后需要把数据传回给磁盘。为了避免一条条读取数据,InnoDB采用以页为单位从磁盘获取数据的方式。InnoDB中页大小通常为16KB。延伸:磁盘与内存的交互有很大的学问,在实际处理时必须要斟酌。例如,以spark为例。.原创 2021-10-11 16:17:36 · 370 阅读 · 0 评论 -
数据库参考资料
这里记录了我学习数据库时主要参考的资料1、MySQL是怎样运行的——从根上理解MySQL原创 2021-10-11 15:40:51 · 145 阅读 · 0 评论