使用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查詢,從而提高整體性能。