通信電纜 網絡設備 無線通信 云計算|大數據 顯示設備 存儲設備 網絡輔助設備 信號傳輸處理 多媒體設備 廣播系統 智慧城市管理系統 其它智慧基建產品
深圳市雷文電子有限公司
閱讀:134發布時間:2022-2-11
MySQL 可能是最的關系數據庫管理系統 (RDBMS),作為一款免費開源軟件開發,最初由 MYSQL AB 公司提供支持,但現在歸 Oracle 所有。
在 MySQL 中,用于表的“存儲引擎"決定了數據的處理方式。有幾種可用的存儲引擎,但的是 InnoDB 和 MyISAM。
在本文中,我們將了解它們的顯著特征以及它們之間的主要區別。
在本教程中,您將學習:
在我們討論兩個主要 MySQL 存儲引擎之間的特性和區別之前,先來了解一下什么是存儲引擎?
存儲引擎,也稱為“表處理程序",基本上是解釋和管理與數據庫表的 SQL 查詢相關的操作的數據庫部分。
在版本的 MySQL 中,可以使用“可插拔"架構來組織和管理存儲引擎,存在多種存儲引擎,但的兩個是InnoDB和MyISAM。
要獲得我們正在使用的數據庫中可用存儲引擎的列表,我們所要做的就是發出一個簡單的 SQL 查詢,因此我們需要做的件事就是打開一個 MySQL 交互式提示并使用數據庫用戶登錄及其密碼:
$ mysql -u -p
如果登錄成功,提示將變為mysql>,在這里,我們可以運行我們的 SQL 查詢來可視化可用的存儲引擎:
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 |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
在上表中,作為查詢結果生成,我們可以通過查看Support每行列中的值輕松了解支持哪些存儲引擎,“YES"值表示存儲引擎可用,否則“NO"。相反,同一列中的“DEFAULT"值表示相應的引擎(在本例中為 InnoDB)是服務器使用的默認引擎。
“Transactions"和“Savepoints"列中存在的值分別表示存儲引擎是否支持事務和回滾。正如我們通過查看表可以看到的,只有 InnoDB 引擎可以。
關于存儲引擎的信息存在于“INFORMATION_SCHEMA"數據庫的“ENGINES"表中,因此我們也可以發出標準的“SELECT"查詢來獲取我們需要的數據:
mysql> SELECT * FROM INFORMATION_SCHEMA.ENGINES
我們將獲得與上面看到的相同的結果。
讓我們看看兩個的存儲引擎 InnoDB 和 MyISAM 之間的主要特性和區別是什么。
正如我們已經說過的, InnoDB 是自 MySQL 以來的默認存儲引擎5.5。
此存儲引擎的一些主要功能如下:
對事務的支持提供了一種安全的方式來執行多個查詢以保持數據一致。
當多個修改數據的操作被執行并且我們想要確保它們只有在所有操作都成功并且沒有錯誤發生時才有效時,我們想要使用事務。
典型的處理方式是啟動事務并執行查詢:如果出現錯誤,則執行回滾,否則提交更改。
當使用 InnoDB 數據鎖定發生在行級別時,因此在事務期間鎖定的數據量是有限的。
InnoDB 有兩種類型的鎖:
一個共享鎖允許誰擁有它讀取該行的交易,而一個排它鎖允許交易執行其修改行的操作,所以要更新或刪除數據。
當一個事務在某行上獲得共享鎖,而另一個事務需要相同的鎖類型時,立即授予;但是,如果第二個事務在同一行上請求排他鎖,它將不得不等待。
如果個事務持有該行的排他鎖,則第二個事務將不得不等待該鎖被釋放以獲得共享鎖或排他鎖。
外鍵是一個非常重要的特性,因為它們可用于基于表之間的邏輯關系來強制執行數據完整性。想象一下,我們的數據庫中有三個表(假設它被稱為“testdb"):一個user包含現有用戶的job表,一個注冊所有可用作業的user_job表,以及一個用于表示用戶和用戶之間存在的多對多關系的表。作業(一個用戶可以有多個作業,多個作業可以與同一個用戶關聯)。
該user_job表就是所謂的連接表或關聯表,因為它的目的是表示用戶-工作關聯。該表有兩列,一個叫user_id和其他job id。表中會存在兩個外鍵約束,強制執行以下規則:user_id列中的值只能引用表id列中的值,列中的user值job_id必須引用表id列中的現有值job.
這將強制執行完整性,因為僅允許現有用戶和作業的 ID 存在于關聯表中。刪除涉及表中一個或多個關聯的用戶或作業user_job也是不允許的,除非為相應的外鍵設置了CASCADE DELETE規則。在這種情況下,當刪除用戶或作業時,它們所涉及的關系也將被刪除。
MyISAM 曾經是默認的 MySQL 存儲引擎,但已被 InnoDB 取代。使用此引擎時,數據鎖定發生在表級別,因此執行操作時鎖定的數據更多。
與 InnoDB 不同,MyISAM 不支持事務回滾和提交,因此必須手動執行回滾。MyISAM 和 InnoDB 之間的另一個很大區別是前者不支持外鍵。MyISAM 更簡單,并且在對有限數據集進行讀取密集型操作時可能具有優勢(有爭議)。
在表上使用 MyISAM 時,會設置一個標志,指示該表是否需要修復,例如在突然關閉之后。稍后可以使用適當的工具執行表修復。
如何知道特定表使用了什么存儲引擎?我們所要做的就是發出一個簡單的查詢。
例如,要知道user我們在前面的例子中提到的表使用了什么存儲引擎,我們將運行:
mysql> SHOW TABLE STATUS WHERE name = 'user' /G;
注意上面的查詢我們使用了/G,為了讓查詢結果垂直顯示,優化空間。執行查詢后,我們將獲得以下結果:
*************************** 1. row ***************************
Name: user
Engine: InnoDB
Version: 10
Row_format: Dynamic
Rows: 0
Avg_row_length: 0
Data_length: 16384
Max_data_length: 0
Index_length: 0
Data_free: 0
Auto_increment: NULL
Create_time: 2021-12-27 09:38:16
Update_time: NULL
Check_time: NULL
Collation: utf8mb4_0900_ai_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
在這種情況下,通過查看“Engine"列中存儲的值,我們可以清楚地看到該表使用的是“InnoDB"引擎。獲取相同信息的另一種方法是INFORMATION_SCHEMA.TABLES直接查詢表:
mysql> SELECT ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'user' AND TABLE_SCHEMA = 'testdb';
上面的查詢將只返回表使用的引擎:
+--------+
| ENGINE |
+--------+
| InnoDB |
+--------+
如果我們稍微更改查詢,我們可以獲得數據庫中所有表名的列表以及它們使用的引擎:
mysql> SELECT TABLE_NAME, ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'testdb';
如果我們要為一個表設置一個特定的存儲引擎,我們可以在創建時它。例如,假設我們正在創建job表,并且出于某種原因我們想要使用 MyISAM 存儲引擎。我們將發出以下 SQL 查詢:
mysql> CREATE TABLE testdb.job ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20) NOT NULL ) ENGINE = MyISAM;
相反,如果我們想要更改用于已存在表的存儲引擎,我們只需要使用ALTERSQL 語句。假設我們要將上一個示例中創建的“job"表所使用的存儲引擎更改為 InnoDB;我們會運行:
mysql> ALTER TABLE testdb.job ENGINE = InnoDB;
在本教程中,我們學習了什么是數據庫存儲引擎,并且我們看到了兩個的 MySQL 引擎的主要特性:InnoDB 和 MyISAM。
我們看到了如何檢查哪些引擎可用、哪些引擎用于表以及如何使用 SQL 查詢設置和修改表引擎。
智慧城市網 設計制作,未經允許翻錄必究 .? ? ?
請輸入賬號
請輸入密碼
請輸驗證碼
請輸入你感興趣的產品
請簡單描述您的需求
請選擇省份