一卓的博客

怕什么真理无穷,
进一寸有一寸的欢喜。

0%

概念

MySQL 数据库区别于其他数据库的最重要的一个特点就是其插件式的表存储引擎。需要注意的是,存储引擎是基于表的,而不是数据库的(即同一个数据库中的不同表可以有不同的存储引擎)。

查看支持哪些存储引擎

想了解 MySQL 中支持的引擎的情况,可以使用如下命令查看:

1
show engines;
阅读全文 »

MVCC(Mutil-Version Concurrency Control),就是多版本并发控制。

MVCC 是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问。

在 MySQL 的 InnoDB 引擎中就是指在已提交读 (READ COMMITTD) 和可重复读 (REPEATABLE READ) 这两种隔离级别下的事务对于 SELECT 操作会访问版本链中的记录的过程。

这就使得别的事务可以修改这条记录,反正每次修改都会在版本链中记录。SELECT 可以去版本链中拿记录,这就实现了读-写,写-读的并发执行,提升了系统的性能。

阅读全文 »

MySQL 事务日志

事务日志可以帮助提高事务的效率。使用事务日志,存储引擎在修改表的数据时只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘上的事务日志中,而不用每次都将修改的数据本身持久到磁盘。事务日志采用的是追加的方式,因此写日志的操作是磁盘上一小块区域内的顺序I/O,而不像随机I/O需要在磁盘的多个地方移动磁头,所以采用事务日志的方式相对来说要快得多。事务日志持久以后,内存中被修改的数据在后台可以慢慢地刷回到磁盘。目前大多数存储引擎都是这样实现的,我们通常称之为预写式日志(Write-Ahead Logging),修改数据需要写两次磁盘。

如果数据的修改已经记录到事务日志并持久化,但数据本身还没有写回磁盘,此时系统崩溃,存储引擎在重启时能够自动恢复这部分修改的数据。

MySQL Innodb中跟数据持久性、一致性有关的日志,有以下几种:

  • Bin log
  • Redo log
  • Undo log
阅读全文 »

在讲解 Mysql 的隔离级别与事务之前,先要了解一下概念:什么是 脏读、幻读、不可重复读?

假如有表 User 中数据如下

id name age sex
1 Jack 25
2 Rose 23
阅读全文 »

位运算

  • 按位与(&) 都1则1

    • 对两个数进行操作,然后返回一个新的数,这个数的每个位都需要两个输入数的同一位都为1时才为1
  • 按位或(|) 有1则1

    • 比较两个数,然后返回一个新的数,这个数的每一位设置1的条件是两个输入数的同一位都不为0(即任意一个为1,或都为1)
  • 按位异或(^) 不同为1 相同为0 两数异或 可看作是两数没有进位的加法

    • 比较两个数,然后返回一个数,这个数的每个位设为1的条件是两个输入数的同一位不同,如果相同就设为0
    • 异或运算最重要的性质,就是 0 和任何一个数字(y)异或的结果,都是这个数字本身。即:0 ^ y = y
    • 异或满足交换律 x ^ y = y ^ x
    • 两个相同的数字做异或, 结果为 0
    • 取最低位的1 n & -n
    • 将最低位的1移除 n & (n-1)
阅读全文 »

什么是算法?

在计算机科学中,每当我们要解决一些计算问题时,我们都会定义一组解决该问题需要遵循的步骤。这些步骤统称为算法。

如何区分算法的好坏?

针对特定问题可以有很多算法。那么,如何区分算法的好坏呢?

让我们了解一个好的算法的属性:

  • 正确性:如果算法对于每组输入都以正确的输出停止运行,则该算法被认为是正确的。如果没有为任何特定的输入集获得正确的输出,则你的算法是错误的。
  • 有限性:通常,人们会忽略这一点,但这是算法评估中的重要因素之一。该算法必须始终在有限数量的步骤后终止。例如,在递归和循环的情况下,你的算法应终止,否则最终将分别产生堆栈溢出和无限循环的情况。
  • 效率:始终使用高效算法。效率一词是指:
    1. 该算法应有效地使用系统可用的资源。
    2. 计算时间(生成对应于特定输入的输出所花费的时间)应尽可能短。
    3. 算法使用的内存也应尽可能少。通常,在计算时间和内存之间需要权衡。因此,我们需要确定时间是否比空间重要,反之亦然,然后相应地编写算法。

因此,我们已经看到了可用于评估算法的三个因素。在这三个因素中,最重要的因素是算法的效率。

阅读全文 »