搞定PHP面試 - MySQL基礎知識點整理 - 存儲引擎

MySQL基礎知識點整理 - 存儲引擎

0. 查看 MySQL 支持的存儲引擎

可以在 mysql 客戶端中,使用 show engines; 命令可以查看MySQL支持的引擎:

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

1. InnoDB 引擎

InnoDB 是 MySQL 默認的存儲引擎,也是最重要、使用最廣泛的存儲引擎。
InnoDB 的性能和自動崩潰恢復特性,使得它在非事務型存儲的需求中也很流行。
除非有非常特別的原因需要使用其他的存儲引擎,否則應該優先考慮 InnoDB 引擎。

InnoDB 的特性

  • 支持事務。
  • 支持外鍵約束。
  • 支持行級鎖機制。
  • 支持崩潰後的安全恢復。
  • 通過一些機制和工具支持真正的熱備份。
  • 會在主內存中建立其專用的緩衝池用於高速緩衝數據和索引,因此InnoDB的表需要更多的內存和存儲空間。
  • InnoDB是聚集索引,數據文件是和索引綁在一起的,必須要有主鍵,通過主鍵索引效率很高。但是輔助索引需要兩次查詢,先查詢到主鍵,然後再通過主鍵查詢到數據。因此,主鍵不應該過大,因爲主鍵太大,其他索引也都會很大。
  • InnoDB 不保存表的具體行數,執行 select count(*) from table 時需要全表掃描。

InnoDB 存儲表和索引有兩種方式

使用共享表空間存儲: 表結構保存在 .frm 文件中,數據和索引在 innodb_data_home_dirinnodb_data_file_path 定義的表空間中,可以是多個文件。
使用多表空間存儲: 表結構保存在 .frm 文件中,每個表的數據和索引單獨保存在 .ibd 中。

InnoDB 的使用場景

更新密集的表: InnoDB存儲引擎特別適合處理多重併發的更新請求。
事務: InnoDB存儲引擎是支持事務的標準MySQL存儲引擎。
自動災難恢復: InnoDB表能夠自動從災難中恢復。
外鍵約束: MySQL支持外鍵的存儲引擎只有InnoDB。
支持自動增加列 AUTO_INCREMENT 屬性。

2. MyISAM 引擎

MyISAM 是 MySQL 5.1 及之前版本的默認存儲引擎。MySQL 8 即將廢棄 MyISAM 引擎。
MyISAM 提供了全文索引、壓縮、空間函數(GIS)等特性。
MyISAM 不支持事務和行級鎖,崩潰後無法安全恢復。

MyISAM 的特性

  • 支持全文索引。
  • 支持表級鎖,不支持行級鎖。
  • 不支持事務。
  • 擁有較高的插入,查詢速度。
  • MyISAM 是非聚集索引,數據文件是分離的,索引保存的是數據文件的指針。主鍵索引和輔助索引是獨立的。
  • MyISAM 用一個變量保存了整個表的行數,執行 select count(*) from table 時只需要讀出該變量即可,速度很快。

MyISAM 的三種存儲格式

MyISAM 的三種存儲格式分別爲靜態、動態和壓縮。MyISAM 會根據表的定義自動選擇存儲格式。

靜態表: 如果數據表中的各數據列的長度都是預先固定好的,服務器將自動選擇這種表類型。因爲數據表中每一條記錄所佔用的空間都是一樣的,所以這種表存取和更新的效率非常高。當數據受損時,恢復工作也比較容易做。
動態表: 如果數據表中出現 varchar*text*BLOB 字段時,服務器將自動選擇這種表類型。相對於靜態MyISAM,這種表存儲空間比較小,但由於每條記錄的長度不一,所以多次修改數據後,數據表中的數據就可能離散的存儲在內存中,進而導致執行效率下降。同時,內存中也可能會出現很多碎片。因此,這種類型的表要經常用 optimize table 命令或優化工具來進行碎片整理。
壓縮表: 以上說到的兩種類型的表都可以用myisamchk工具壓縮。如果表在創建並導入數據後,不在進行修改操作,這樣的表適合採用 MyISAM 壓縮表。這種類型的表進一步減小了佔用的存儲,但是這種表壓縮之後不能再被修改。另外,因爲是壓縮數據,所以這種表在讀取的時候要先時行解壓縮。

MyISAM 表存儲

每個 MyISAM 表在磁盤上存儲成三個文件,每一個文件的名字均以表的名字開始,擴展名指出文件類型。
.frm 文件存儲表結構定義。
.MYD (MYData) 文件存儲表的數據。
.MYI (MYIndex) 文件存儲表的索引。

MyISAM 使用場景

查詢密集型表: MyISAM 存儲引擎在篩選大量數據時非常快,是它最突出的優點;
插入密集型表: MyISAM 的併發插入特性允許同時選擇、插入數據。例如:MyISAM存儲引擎非常適合管理郵件或Web服務器日誌數據。

3. MEMORY 引擎

MEMORY 引擎(也叫 HEAP 引擎),將所有數據都保存在內存中,不需要進行磁盤I/O。因此,MEMORY表至少比 MyISAM 錶快一個數量級。
MySQL 重啓或 mysqld 守護進程崩潰時,Memory 表的結構還會保留,但是所有的數據都會丟失。

獲得速度的同時也帶來一些缺陷。它要求存儲在Memory數據表裏的數據用的是長度不變的格式,這意味着不能用BLOB和TEXT這樣的長度可變的數據類型,VARCHAR是種長度可變的類型,但因爲它在MySQL內部當做長度固定不變的CHAR類型,所以可以使用。

MEMORY 的特性

  • 數據都保存在內存中,不需要進行磁盤I/O。
  • 支持 Hash 索引和B樹索引。
  • 支持表級鎖,不支持行級鎖。
  • 服務重啓後,表結構還會保留,但是數據會丟失。
  • 不支持 TEXT 和 BLOB 類型的列。

MEMORY 使用場景

  • 需要快速地訪問數據,並且這些數據不會被修改,重啓以後丟失也沒有關係。
  • 用於查找(lookup)或者映射(mapping)表,例如將郵編和地址映射的表。
  • 用於保存數據分析中產生的中間數據。
  • 用於緩存週期性聚合數據的結果。

4. ARCHIVE 引擎

ARCHIVE 引擎是一個針對插入和壓縮做了優化的簡單存儲引擎。
ARCHIVE 引擎只支持 INSERT 和 SELECT 操作。MySQL 5.1 之前也不支持索引。
ARCHIVE 引擎會利用 zlib 對插入的行進行壓縮,所以比 MyISAM 表的磁盤 I/O 更少。

ARCHIVE 的特性

  • 只支持 INSERT 和 SELECT 操作。
  • MySQL 5.1 之前不支持索引。
  • 支持行級鎖和專用緩衝區。

ARCHIVE 使用場景

  • 適合日誌和數據採集類應用,這類應用做數據分析時往往需要全表掃描。
  • 需要快速 INSERT 操作的場景。

5. MERGE 引擎

MERGE 存儲引擎是 MyISAM 引擎的變種。MERGE 表是由多個 MyISAM 表合併而來的虛擬表,這些MyISAM表結構必須完全相同。Merge表中並沒有數據,對Merge類型的表可以進行查詢、更新、刪除操作,這些操作實際上是對內部的MyISAM表進行操作。

Merge存儲引擎使用場景對於服務器日誌這種信息,一般常用的存儲策略是將數據分成很多表,每個名稱與特定時間端相關。例如:可以用12個相同的表來存儲服務器的日誌數據,每個表用對應各個月份的名字來命名。當有必要基於所有12個日誌表的數據來生成報表時,這意味着需要編寫、更新多表查詢,以反映這些表中的信息。與其編寫這些可能會出現錯誤的查詢,不如將這些表合併起來使用一條查詢,之後再刪除Merge表而不影響原來的數據,刪除Merge表只會刪除掉Merge表的定義,對內部表沒有任何影響。

但是引入分區功能後,該引擎已經被放棄。

6. CSV 引擎

CSV 引擎可以將普通的 CSV 文件作爲 MySQL 的表來處理,但是這種表不支持索引。

CSV 的特點

  • 可以將普通的 CSV 文件作爲 MySQL 的表來處理。
  • 所有的列必須都是不能爲NULL的
  • 不支持索引(不適合大表,不適合在線處理)
  • 可以對數據文件直接編輯(保存文本文件內容)

CSV 使用場景

  • 適合做爲數據交換的中間表(能夠在服務器運行的時候,拷貝和拷出文件,可以將電子表格存儲爲CSV文件再拷貝到MySQL數據目錄下,就能夠在數據庫中打開和使用。同樣,如果將數據寫入到CSV文件數據表中,其它web程序也可以迅速讀取到數據。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章