1. 程式人生 > >mysql從頭學一 1.0儲存引擎概述

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 儲存引擎的相關特性。