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);
}
```
我用偽代碼實現了一個記錄,這些記錄串聯起來就是一個表。這個表建立成功并插入幾條數據以后,看起來是這樣子的:

但是InnoDB沒有這么像我這樣圖省事,而是將數據頁組織成了一棵樹。也就是說,InnoDB的表,實際上就是一個樹,這在專業術語里叫做索引組織表(IOT)。將表按照主鍵組織成一顆樹,好處是提高了按照主鍵檢索的效率,當然也有壞處,壞處是占空間多了,出現碎片的風險也大了,這些以后會慢慢道來。
以前MyISAM的支持者們非常驕傲的全文索引,在MySQL5.6版本之后,也是支持的了,因此更沒有使用MyISAM的可能了。
用戶永遠不會希望自己的數據丟失,ACID原則是保護用戶數據的基礎,這一點InnoDB是完全支持的,為了數據的安全,也應該早早的將重要的業務轉為InnoDB。
雖然現在的版本早已經將默認引擎調整為了InnoDB,但是還是有很多人會認為MyISAM是默認引擎,這也算是MySQL日常偽科學了。