
课程咨询: 400-996-5531
投诉建议: 400-111-8989
认真做教育 专心促就业
随着互联网的不断发展,越来越多的人都在学习达内Java培训等互联网课程,而本文我们就通过案例分析来简单了解一下,数据库特性如何保持。
数据库如何保证持久性
主要是利用Innodb的redolog。重写日志,正如之前说的,MySQL是先把磁盘上的数据加载到内存中,在内存中对数据进行修改,再写回到磁盘上。如果此时突然宕机,内存中的数据就会丢失。怎么解决这个问题?简单啊,事务提交前直接把数据写入磁盘就行啊。这么做有什么问题?
只修改一个页面里的一个字节,就要将整个页面刷入磁盘,太浪费资源了。毕竟一个页面16kb大小,你只改其中一点点东西,就要将16kb的内容刷入磁盘,听着也不合理。
毕竟一个事务里的SQL可能牵涉到多个数据页的修改,而这些数据页可能不是相邻的,也就是属于随机IO。显然操作随机IO,速度会比较慢。
于是,决定采用redolog解决上面的问题。当做数据修改的时候,不仅在内存中操作,还会在redolog中记录这次操作。当事务提交的时候,会将redolog日志进行刷盘(redolog一部分在内存中,一部分在磁盘上)。当数据库宕机重启的时候,会将redolog中的内容恢复到数据库中,再根据undolog和binlog内容决定回滚数据还是提交数据。
采用redolog的好处?
其实好处就是将redolog进行刷盘比对数据页刷盘效率高,具体表现如下:
redolog体积小,毕竟只记录了哪一页修改了啥,因此体积小,刷盘快。
redolog是一直往末尾进行追加,属于顺序IO。效率显然比随机IO来的快。
数据库如何保证原子性
主要是利用Innodb的undolog。undolog名为回滚日志,是实现原子性的关键,当事务回滚时能够撤销所有已经成功执行的SQL语句,他需要记录你要回滚的相应日志信息。例如
当你delete一条数据的时候,就需要记录这条数据的信息,回滚的时候,insert这条旧数据
当你update一条数据的时候,就需要记录之前的旧值,回滚的时候,根据旧值执行update操作
当年insert一条数据的时候,就需要这条记录的主键,回滚的时候,根据主键执行delete操作
undolog记录了这些回滚需要的信息,当事务执行失败或调用了rollback,导致事务需要回滚,便可以利用undolog中的信息将数据回滚到修改之前的样子。
数据库如何保证一致性
从数据库层面,数据库通过原子性、隔离性、持久性来保证一致性。也就是说ACID四大特性之中,C(一致性)是目的,A(原子性)、I(隔离性)、D(持久性)是手段,是为了保证一致性,数据库提供的手段。数据库必须要实现AID三大特性,才有可能实现一致性。例如,原子性无法保证,显然一致性也无法保证。
从应用层面,通过代码判断数据库数据是否有效,然后决定回滚还是提交数据!
数据库高并发的解决方案
在web服务框架中加入缓存。在服务器与数据库层之间加入缓存层,将高频访问的数据存入缓存中,减少数据库的读取负担。
增加数据库索引,进而提高查询速度。(不过索引太多会导致速度变慢,并且数据库的写入会导致索引的更新,也会导致速度变慢)
主从读写分离,让主服务器负责写,从服务器负责读。
将数据库进行拆分,使得数据库的表尽可能小,提高查询的速度。
使用分布式架构,分散计算压力。
数据库结构优化的手段
范式优化:比如消除冗余(节省空间。。)
反范式优化:比如适当加冗余等(减少join)
限定数据的范围:务必禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内。
读/写分离:的数据库拆分方案,主库负责写,从库负责读;
拆分表:分区将数据在物理上分隔开,不同分区的数据可以制定保存在处于不同磁盘上的数据文件里。这样,当对这个表进行查询时,只需要在表分区中进行扫描,而不必进行全表扫描,明显缩短了查询时间,另外处于不同磁盘的分区也将对这个表的数据传输分散在不同的磁盘I/O,一个精心设置的分区可以将数据传输对磁盘I/O竞争均匀地分散开。对数据量大的时时表可采取此方法。可按月自动建表分区。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。