怎麼優雅的選擇 MySQL 存儲引擎

友情提示:此篇文章大約須要閱讀 8分鐘53秒,不足之處請多指教,感謝你的閱讀。訂閱本站mysql

此文章首發於 Debug客棧 |https://www.debuginn.cnsql

對於數據庫這一塊詢問比較多的就是在 MySQL 中怎麼去選擇一種什麼時候當前業務需求的存儲引擎,而 MySQL 中支持的存儲引擎又有不少種,那麼 MySQL 中分別又有那些,怎麼優雅的使用呢?數據庫

劃分引擎緣由

在文件系統中,MySQL 將每一個數據庫(也能夠稱之爲 schema )保存爲數據目錄下的一個子目錄。建立表時,MySQL 會在數據庫子目錄下建立一個和表同名的 .frm 文件保存表的定義。例如建立一個名爲 DebugTable 的表,MySQL 會在 DebugTable.frm 文件中保存該表的定義。緩存

由於 MySQL 使用文件系統的目錄和文件來保存數據庫和表的定義,大小寫敏感性和具體的平臺密切相關。在 Windows 系統中,大小寫是不敏感的;而在類 Unix 系統中則是敏感的。不一樣的存儲引擎保存數據和索引的方式是不一樣的,但表的定義則是在 MySQL 服務層wk統一處理的。併發

查看支持引擎

想了解 MySQL 中支持的引擎的狀況,可使用以下命令查看:app

show engines;

結果以下(MySQL版本:Ver 8.0.19):ide

mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

存儲引擎分類

MySQL 存儲引擎分類有 MyISAM、InnoDB、Memory、Merge等,能夠看上面表中列出的支持引擎,可是其中最爲經常使用的就是 MyISAM 和 InnoDB 兩個引擎,其中針對於以上講到的存儲引擎,以下表進行對比:
image.png性能

MyISAM 與 InnoDB 區別

兩種類型最主要的差異是InnoDB支持事務處理與外鍵和行級鎖。spa

  1. InnoDB 可藉由事務日誌( Transaction Log )來恢復程序崩潰( crash ),或非預期結束所形成的數據錯誤;
    而 MyISAM 遇到錯誤,必須完整掃描後才能重建索引,或修正未寫入硬盤的錯誤。
  2. InnoDB 的修復時間,通常都是固定的,但 MyISAM 的修復時間,則與數據量的多寡成正比。
  3. 相對而言,隨着數據量的增長InnoDB有較佳的穩定性
  4. MyISAM 必須依靠操做系統來管理讀取與寫入的緩存,而 InnoDB 則是有本身的讀寫緩存管理機制。( InnoDB 不會將被修改的數據頁當即交給操做系統)所以在某些狀況下,InnoDB 的數據訪問會比 MyISAM 更有效率
  5. InnoDB 目前並不支持 MyISAM 所提供的壓縮與 terse row formats(簡潔的行格式) ,因此對硬盤與高速緩存的使用量較大
  6. 當操做徹底兼容 ACID(事務)時,雖然 InnoDB 會自動合併數筆鏈接,但每次有事務產生時,仍至少須寫入硬盤一次,所以對於某些硬盤或磁盤陣列,會形成每秒 200 次的事務處理上限。
    若但願達到更高的性能且保持事務的完整性,就必使用磁盤緩存與電池備援。
    固然 InnoDB 也提供數種對性能衝擊較低的模式,但相對的也會下降事務的完整性。而MyISAM則無此問題,但這並不是由於它比較先進,這只是由於它不支持事務。

應用場景

  • MyISAM 管理非事務表。它提供高速存儲和檢索,以及全文搜索能力。若是應用中須要執行大量的 SELECT 查詢,那麼 MyISAM 是更好的選擇。
  • InnoDB 用於事務處理應用程序,具備衆多特性,包括 ACID 事務支持。若是應用中須要執行大量的 INSERT 或 UPDATE 操做,則應該使用 InnoDB,這樣能夠提升多用戶併發操做的性能。

參考文章

相關文章
相關標籤/搜索