MySQL儲存引擎MyISAM與InnoDB的優劣

科技小能手發表於2017-11-12

使用MySQL當然會接觸到MySQL的儲存引擎,在新建資料庫和新建資料表的時候都會看到。

MySQL預設的儲存引擎是MyISAM,其他常用的就是InnoDB了。

至於到底用哪種儲存引擎比較好?這個問題是沒有定論的,需要根據你的需求和環境來衡量。所以對這兩種引擎的概念、原理、異同和各自的優劣點有了詳細的瞭解之後,再根據自己的情況選擇起來就容易多了。


MyISAM InnoDB
儲存結構 每張表被存放在三個檔案:
  1. frm-表格定義

  2. MYD(MYData)-資料檔案

  3. 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查詢,從而提高整體效能。

本文轉自 小楊_Ivan 51CTO部落格,原文連結:http://blog.51cto.com/aqiang/1896091


相關文章