youyichannel

志于道,据于德,依于仁,游于艺!

0%

《MySQL是怎样运行的 —— 从跟上理解MySQL》—— 第十九章

一、redo log简介

InnoDB存储引擎是以页为单位来管理存储空间的,在真正访问页面之前,需要把在磁盘上的页缓存到内存中的Buffer Pool之后才可以访问。对于一个已经提交的事务,在事务提交后即使系统发生了崩溃,这个事务对数据库中所做的更改也不能丢失。

这个过程就会存在一个问题,但是只在内存的Buffer Pool中修改了页面,假设在事务提交后突然发生了某个故障,导致内存中的数据都失效了,那么这个已经提交了的事务对数据库中所做的更改也就跟着丢失了。

问题:那么如何保证这个持久性呢?一个很简单的做法就是在事务提交完成之前把该事务所修改的所有页面都刷新到磁盘,这个方案存在些许问题:

  • 刷新一个完整的数据页浪费、开销大:有时候仅仅修改了某个页面中的一个字节,但是在InnoDB中是以页为单位来进行磁盘IO的,也就是说在该事务提交时不得不将一个完整的页面从内存中刷新到磁盘,一个页面默认是16KB大小,只修改一个字节就要刷新16KB的数据到磁盘上显然是太浪费了。
  • 随机IO性能低下:一个事务可能包含很多语句,即使是一条语句也可能修改许多页面,可能的是该事务修改的这些页面可能并不相邻,这就意味着在将某个事务修改的Buffer Pool中的页面刷新到磁盘时,需要进行很多的随机IO,随机IO比顺序IO要慢,尤其对于传统的机械硬盘来说。
阅读全文 »

《MySQL是怎样运行的 —— 从跟上理解MySQL》—— 第十八章

一、事务的概念

事务是一个抽象的概念,它其实对应着一个或多个数据库操作。将需要保证原子性隔离性一致性持久性的一个或多个数据库操作称之为一个事务

阅读全文 »

《MySQL是怎样运行的 —— 从跟上理解MySQL》—— 第十七章

一、Buffer Pool简介

为了缓存磁盘中的页,InnoDBMySQL服务器启动的时候就向操作系统申请了一片连续的内存,这片内存叫做Buffer Pool(缓冲池)。

默认情况下Buffer Pool只有128M大小。可以在启动服务器的时候配置innodb_buffer_pool_size参数的值:

[server]
innodb_buffer_pool_size = 268435456

其中,268435456的单位是字节,即指定Buffer Pool的大小为256M。需要注意的是,Buffer Pool也不能太小,最小值为5M(当小于该值时会自动设置成5M)。

阅读全文 »

《MySQL是怎样运行的 —— 从跟上理解MySQL》—— 第十六章

MySQL5.6以及之前的版本,查询优化器就像是一个黑盒子一样,用户只能通过EXPLAIN语句查看到最后优化器决定使用的执行计划,却无法知道它为什么做这个决策。

MySQL5.6以及之后的版本中,MySQL提出了一个optimizer trace的功能,这个功能可以方便的查看优化器生成执行计划的整个过程,这个功能的开启与关闭由系统变量optimizer_trace决定。

阅读全文 »

原子性说明

无论存在多少个子操作,只要将这部分操作通过加锁的形式进行锁定,那么就可以视为一个原子性操作。

原子性操作 <=> 线程安全

阅读全文 »

Condition 原理

ConditionObject是同步器AQS的累不累,因为Condition的操作需要获取相关联的锁,所以作为同步器的内部类也较为合理。每个Condition对象都包含一个队列(等待队列),该队列是Condition对象实现等待/通知功能的关键。

阅读全文 »

Condition 解读

任意一个Java对象,都拥有一组监视器方法,定义在java.lang.Object上,主要包括wait()wait(long timeout)notify()以及notifyAll(),这些方法与synchronized同步关键字配合,可以实现等待/通知模式。

阅读全文 »

《MySQL是怎样运行的 —— 从跟上理解MySQL》—— 第十五章

一条查询语句在经过MySQL查询优化器的各种基于成本和规则的优化会后生成一个执行计划,这个执行计划展示了接下来具体执行查询的方式。MySQL中提供了EXPLAIN语句来帮助我们查询某个查询语句的具体执行计划。

阅读全文 »