在mysql中常用的數據存儲方法有MyISAM與InnoDB,其它的像什麼內存之類我們想都不用想,下面我來介紹MyISAM與InnoDB各種優點與不足吧。
使用MySQL當然會接觸到MySQL的存儲引擎,在新建數據庫和新建數據表的時候都會看到。
MySQL默認的存儲引擎是MyISAM,其他常用的就是InnoDB了。
至於到底用哪種存儲引擎比較好?這個問題是沒有定論的,需要根據你的需求和環境來衡量。所以對這兩種引擎的概念、原理、異同和各自的優劣點有了詳細的了解之後,再根據自己的情況選擇起來就容易多了。
|
MyISAM |
InnoDB |
存儲結構
每張表被存放在三個文件:
- frm-表格定義
- MYD(MYData)-數據文件
- MYI(MYIndex)-索引文件
所有的表都保存在同一個數據文件中(也可能是多個文件,或者是獨立的表空間文件),InnoDB表的大小只受限於操作系統文件的大小,一般為2GB
存儲空間
MyISAM可被壓縮,存儲空間較小
InnoDB的表需要更多的內存和存儲,它會在主內存中建立其專用的緩沖池用於高速緩沖數據和索引
可移植性、備份及恢復
由於MyISAM的數據是以文件的形式存儲,所以在跨平台的數據轉移中會很方便。在備份和恢復時可單獨針對某個表進行操作
免費的方案可以是拷貝數據文件、備份 binlog,或者用 mysqldump,在數據量達到幾十G的時候就相對痛苦了
事務安全
不支持每次查詢具有原子性
支持具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表
AUTO_INCREMENT
MyISAM表可以和其他字段一起建立聯合索引
InnoDB中必須包含只有該字段的索引
SELECT
MyISAM更優
INSERT
InnoDB更優
UPDATE
InnoDB更優
DELETE
InnoDB更優它不會重新建立表,而是一行一行的刪除
COUNT without WHERE
MyISAM更優。因為MyISAM保存了表的具體行數
InnoDB沒有保存表的具體行數,需要逐行掃描統計,就很慢了
COUNT with WHERE
一樣
一樣,InnoDB也會鎖表
鎖
只支持表鎖
支持表鎖、行鎖行鎖大幅度提高了多用戶並發操作的新能。但是InnoDB的行鎖,只是在WHERE的主鍵是有效的,非主鍵的WHERE都會鎖全表的
外鍵
不支持
支持
FULLTEXT全文索引
支持
不支持可以通過使用Sphinx從InnoDB中獲得全文索引,會慢一點
總的來說,MyISAM和InnoDB各有優劣,各有各的使用環境。
但是InnoDB的設計目標是處理大容量數據庫系統,它的CPU利用率是其它基於磁盤的關系數據庫引擎所不能比的。
我覺得使用InnoDB可以應對更為復雜的情況,特別是對並發的處理要比MyISAM高效。同時結合memcache也可以緩存SELECT來減少SELECT查詢,從而提高整體性能。