🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
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日常伪科学了。