InnoDB是Oracle的模仿者,而且仿的有模有样,通过几年的MySQL学习,回过头来再去搞Oracle时,发现很多事情理解的竟然比当时专门搞Oracle的时候深。
从我自己的经历来看,InnoDB确实是一个杰出的模仿者。
官方对InnoDB的定位是一款为了一般目的设计的存储引擎,兼顾了性能和可靠性。
InnoDB是一个支持事务的引擎,个人拙见,InnoDB是目前MySQL最好的事务性引擎,是最像Oracle的引擎。鉴于Oracle庞大的市场份额,可见市场对Oracle的风格是很认可的,那么InnoDB选择学习Oracle也是个很明智的选择。InnoDB的DML操作都是满足ACID特性的——至于什么是ACID,未来的章节中会详细描述——这一特点保证了数据的安全。
InnoDB采用行级锁,并使用了Oracle风格的一致性读来增强并发场景下的性能。
如果让我们来实现一个数据库,我们将会如何组织表的数据呢?
首先我会实现一个类:
```java
class Record {
/**
* 数据页的唯一Id
*/
private int id;
/**
* 数据页的物理地址
*/
private String addr;
/**
* 下一个数据页的地址
*/
private String nextAddr;
getter & setter
}
```
这段伪代码只实现了三个属性:id,数据页地址,下一个数据页的地址。这基本上可以说明问题了,下面我们来看看怎么忘表里插入数据:
```java
/**
* @param record 当前的记录
* @param addr 要插入的新纪录的地址
*/
public void insert(Record record, String addr) {
record.setNextAddr(addr);
}
```
我用伪代码实现了一个记录,这些记录串联起来就是一个表。这个表建立成功并插入几条数据以后,看起来是这样子的:
![](https://box.kancloud.cn/726b0cf3e7e6c84a5f4de8adca299837_602x119.png)
但是InnoDB没有这么像我这样图省事,而是将数据页组织成了一棵树。也就是说,InnoDB的表,实际上就是一个树,这在专业术语里叫做索引组织表(IOT)。将表按照主键组织成一颗树,好处是提高了按照主键检索的效率,当然也有坏处,坏处是占空间多了,出现碎片的风险也大了,这些以后会慢慢道来。
以前MyISAM的支持者们非常骄傲的全文索引,在MySQL5.6版本之后,也是支持的了,因此更没有使用MyISAM的可能了。
用户永远不会希望自己的数据丢失,ACID原则是保护用户数据的基础,这一点InnoDB是完全支持的,为了数据的安全,也应该早早的将重要的业务转为InnoDB。
虽然现在的版本早已经将默认引擎调整为了InnoDB,但是还是有很多人会认为MyISAM是默认引擎,这也算是MySQL日常伪科学了。