mysql從頭學一 1.0儲存引擎概述
什麼是儲存引擎? 與其他資料庫例如Oracle 和SQL Server等資料庫中只有一種儲存引擎不同的是,MySQL有一個被稱為“Pluggable Storage Engine Architecture”(可替換儲存引擎架構)的特性,也就意味著MySQL資料庫提供了多種儲存引擎。使用者可以根據不同的需求為資料表選擇不同的儲存引擎,使用者也可以根據自己的需要編寫自己的儲存引擎。MySQL資料庫在實際的工作中其實分為了語句分析層和儲存引擎層,其中語句分析層就主要負責與客戶端完成連線並且事先分析出SQL語句的內容和功能,而儲存引擎層則主要負責接收來自語句分析層的分析結果,完成相應的資料輸入輸出和檔案操作。簡而言之,就是如何儲存資料、如何為儲存的資料建立索引和如何更新、查詢資料等技術的實現方法。因為在關係資料庫中資料的儲存是以表的形式儲存的,所以儲存引擎也可以稱為表型別(即儲存和操作此表的型別)。
外掛式儲存引擎是 MySQL 資料庫最重要的特性之一,使用者可以根據應用的需要選擇如何儲存和索引資料、是否使用事務等。MySQL 預設支援多種儲存引擎,以適用於不同領域的資料庫應用需要,使用者可以通過選擇使用不同的儲存引擎提高應用的效率,提供靈活的儲存,使用者甚至可以按照自己的需要定製和使用自己的儲存引擎,以實現最大程度的可定製性。
MySQL 5.0 支援的儲存引擎包括 MyISAM、InnoDB、BDB、MEMORY、MERGE、EXAMPLE、 NDB Cluster、ARCHIVE、CSV、BLACKHOLE、FEDERATED 等,其中 InnoDB 和 BDB 提供事務安全表,其他儲存引擎都是非事務安全表。
預設情況下,建立新表不指定表的儲存引擎,則新表是預設儲存引擎的,如果需要修改預設的儲存引擎,則可以在引數檔案中設定 default-table-type。檢視當前的預設儲存引擎,可以使用以下命令:
mysql> show variables like 'table_type';
+---------------+--------+
| Variable_name | Value |
+---------------+--------+
| table_type | MyISAM |
+---------------+--------+
1 row in set (0.00 sec)
可以通過下面兩種方法查詢當前資料庫支援的儲存引擎,第一種方法為:
mysql> SHOW ENGINES \G *************************** 1. row *************************** Engine: MyISAM Support: DEFAULT Comment: Default engine as of MySQL 3.23 with great performance Transactions: NO XA: NO Savepoints: NO *************************** 2. row *************************** Engine: MEMORY Support: YES Comment: Hash based, stored in memory, useful for temporary tables Transactions: NO XA: NO Savepoints: NO *************************** 3. row *************************** Engine: MRG_MYISAM Support: YES Comment: Collection of identical MyISAM tables Transactions: NO XA: NO Savepoints: NO *************************** 4. row *************************** Engine: InnoDB Support: YES Comment: Supports transactions, row-level locking, and foreign keys Transactions: YES XA: YES Savepoints: YES *************************** 5. row *************************** Engine: CSV Support: YES Comment: CSV storage engine Transactions: NO XA: NO Savepoints: NO 5 rows in set (0.00 sec) |
或者採用第二種方法:
mysql> SHOW VARIABLES LIKE 'have%';
+----------------------------+-------+
| Variable_name | Value | +----------------------------+-------+
| have_archive | NO |
| have_bdb | NO |
| have_blackhole_engine | NO |
| have_compress | YES |
| have_crypt | YES |
| have_csv | YES |
| have_dlopen | YES |
| have_example_engine | NO |
| have_federated_engine | NO |
| have_geometry | YES |
| have_innodb | YES |
| have_ndbcluster | NO |
| have_openssl | NO |
| have_partitioning | YES |
| have_query_cache | YES |
| have_row_based_replication | YES |
| have_rtree_keys | YES |
| have_symlink | YES |
+----------------------------+-------+
18 rows in set (0.00 sec)
以上兩種方法都可以用來檢視當前支援哪些儲存引擎,其中 Value 顯示為“DISABLED”
的記錄表示支援該儲存引擎,但是資料庫啟動的時候被禁用。
在建立新表的時候,可以通過增加 ENGINE 關鍵字設定新建表的儲存引擎,例如,在下
面的例子中,表 ai 就是 MyISAM 儲存引擎的,而 country 表就是 InnoDB 儲存引擎的:
CREATE TABLE ai ( i bigint(20) NOT NULL AUTO_INCREMENT, PRIMARY KEY (i) ) ENGINE=MyISAM DEFAULT CHARSET=gbk; CREATE TABLE country ( country_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT, country VARCHAR(50) NOT NULL, last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (country_id) )ENGINE=InnoDB DEFAULT CHARSET=gbk; |
也可以使用 ALTER TABLE 語句,將一個已經存在的表修改成其他的儲存引擎。下面的例子介紹瞭如何將表 ai 從 MyISAM 儲存引擎修改成 InnoDB 儲存引擎:
mysql> alter table ai engine = innodb; Query OK, 0 rows affected (0.13 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> show create table ai \G |
*************************** 1. row ***************************
Table: ai
Create Table: CREATE TABLE `ai` (
`i` bigint(20) NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`i`)
) ENGINE=InnoDB DEFAULT CHARSET=gbk
1 row in set (0.00 sec)
這樣修改後,ai 表成為 InnoDB 儲存引擎,可以使用 InnoDB 儲存引擎的相關特性。