MyISAM

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

              MyISAM引擎是大多數MySQL安裝程序的默認引擎,起源于早期版本MySQL支持的ISAM引擎。這種引擎提供了最佳的性能和功能的組合,盡管它缺少事務處理功能(使用InnoDB或者BDB引擎)并且使用表級鎖定。

              但是執行一下查詢發現,我在測試的時候使用的兩個測試表在創建的時候沒有指定引擎,但是發現這兩個表的存儲引擎都為InnoDB。(當然我們修改配職文件my.ini中的default-storage-engine=INNODB來修改)。

          mysql> select table_name,engine from tables where table_name like 'test%';
          +------------+--------+
          | table_name | engine |
          +------------+--------+
          | test | InnoDB |
          | test1 | InnoDB |
          +------------+--------+
          2 rows in set (0.08 sec)

              MYSQL文檔的解釋是:“存儲引擎和表類型:當MySQL被用MySQL配置向導安裝在Windows平臺上,InnoDB存儲引擎替代MyISAM存儲引擎作為替代。 ”


              為了測試MyISAM引擎表級鎖定,我們是用MyISAM引擎創建測試表TEST_ISAM。

              測試中打開兩個數據庫連接,一個連接執行call p_tst_isam();另外一個執行單條mysql> insert into test_isam(id,mc) values(1,'1');結果在第一個連接還沒有執行完的時候,第二個就完畢,沒有發現MyISAM引擎鎖表,這個問題我們暫時不再繼續測試下去。測試中發現一個問題,MyISAM引擎的表的INSERT速度遠遠大于InnoDB引擎:

          mysql> CREATE TABLE TEST_ISAM(ID INTEGER,MC VARCHAR(60)) ENGINE=MyISAM;
          Query OK, 0 rows affected (0.38 sec)

          mysql> select table_name,engine from information_schema.tables where table_name like 'test%';
          +------------+--------+
          | table_name | engine |
          +------------+--------+
          | test | InnoDB |
          | test1 | InnoDB |
          | test_isam | MyISAM |
          +------------+--------+
          3 rows in set (0.00 sec)

          創建存儲過程p_test_isam

          delimiter //
          create procedure p_test_isam()
          begin
          declare counter int;
          set counter = 1000000;
          while counter >= 1 do
          insert into test_isam(id,mc) values(counter,'test');
          set counter = counter - 1;
          end while;
          end
          //

          delimiter ;

              我們在以前的測試例子中: InnoDB引擎 INSERT 1000條數據花費34秒

          mysql> call p_test();
          Query OK, 1 row affected (34.48 sec)

          MyISAM引擎INSERT 1000000 條數據花費時間20多秒:

          mysql> call p_test_isam();
          Query OK, 1 row affected (22.95 sec)

              所以,我們如果在使用非事物處理的表(也就是一些只有單用戶使用的表)的時候可以采用MyISAM引擎來提高速度,當然了,INSERT的時候可以利用 MYSQL的BULK INSERT功能來出也是能大大提高性能的,這些我們將在MYSQL數據庫優化一?***:

          INSERT INTO TEST VALUES(VAL11,VAL12),(VAL21,VAL22)……

              測試完畢,翻看一下MYSQL文檔,的確有下面一段話,和我們的測試結果吻合。

          MyISAM管理非事務表。它提供高速存儲和檢索,以及全文搜索能力。MyISAM在所有MySQL配置里被支持,它是默認的存儲引擎,除非你配置MySQL默認使用另外一個引擎。

          MERGE引擎

              MERGE引擎類型允許你把許多結構相同的表合并為一個表。然后可以執行查詢,從多個表返回的結果就像從一個表返回的結果一樣。每一個合并的表必須有同樣的表定義。

              MERGE存儲引擎在下面這種使用場合會最為有用,如果需要把日志紀錄不停的錄入MySQL數據庫,并且每天、每周或者每個月都創建一個單一的表,而且要制作來自多個表的合計查詢,MERGE表這時會非常有效。然而,這項功能有局限性。只能合并MyISAM表而且必須嚴格遵守相同的表定義的限制。雖然這看起來好像是一個大問題,但是,如果使用另外一種表類型(例如InnoDB),這種合并可能就不需要了。

              MEMORY(內存)存儲引擎

              MEMORY(內存)存儲引擎(以前稱作HEAP存儲引擎)在內存中存儲全部數據。一旦MySQL服務器關閉,存儲在內存中的任何信息都將丟失。然而,單個表的格式將保留,使你能夠創建一個用于存儲信息的臨時表。這樣,每次數據庫服務器啟動時,你不需要重新創新這個表就可以快速地訪問信息。

              長期使用MEMORY存儲引擎一般來說不是一個好主意,因為數據很容易丟失。然而,如果你有足夠的內存,使用基于MEMORY的表在大型數據集中執行復雜的查詢是一種非常有效的方法,它能夠很大程度的提高性能。

              使用MEMORY表的最佳方法是使用一個“select”語句從你原來的基于磁盤的表中選擇一個大型的數據集,然后對你需要的具體部分進一步分析那些信息。我過去曾經使用這個技術提取了一個月的網絡記錄數據,實際上就是從使用ARCHIVE存儲引擎制作的表中提取的數據,然后對具體的URL、網站和其它重點進行查詢。

              EXAMPLE引擎

              EXAMPLE引擎實際上是一個存儲引擎編程的例子,能夠用作MySQL系統中其它引擎的基礎。EXAMPLE不支持數據插入,對于任何形式的數據庫訪問來說也不是一個實用的引擎。然而,EXAMPLE是一個很好的指南,指導你如何開發自己的存儲引擎,因此對于程序員來說是一個有效的引擎。

              BDB存儲引擎

              BDB表可能有一個更大的崩潰幸存機會,并且也具有對事務COMMIT和ROLLBACK操作的能力,BDB引擎支持頁級鎖定。

              InnoDB存儲引擎

              InnoDB給MySQL提供了具有提交、回滾、崩潰恢復能力的事務安全(ACID兼容)存儲引擎。InnoDB鎖定在行級并且也在SELECT語句提供一個Oracle風格一致的非鎖定讀。這些特色增加了多用戶部署和性能。沒有在InnoDB中擴大鎖定的需要,因為在InnoDB中行級鎖定適合非常小的空間。InnoDB也支持FOREIGN KEY強制。在SQL查詢中,你可以自由地將InnoDB類型的表與其它MySQL的表的類型混合起來,甚至在同一個查詢中也可以混合。

              InnoDB是為處理巨大數據量時的最大性能設計。它的CPU效率可能是任何其它基于磁盤的關系數據庫引擎所不能匹敵的。

              InnoDB存儲引擎被完全與MySQL服務器整合,InnoDB存儲引擎為在主內存中緩存數據和索引而維持它自己的緩沖池。InnoDB存儲它的表&索引在一個表空間中,表空間可以包含數個文件(或原始磁盤分區)。這與MyISAM表不同,比如在MyISAM表中每個表被存在分離的文件中。InnoDB 表可以是任何尺寸,即使在文件尺寸被限制為2GB的操作系統上。

          InnoDB默認地被包含在MySQL二進制分發中。Windows Essentials installer使InnoDB成為Windows上MySQL的默認表。

              InnoDB被用來在眾多需要高性能的大型數據庫站點上產生。著名的Internet新聞站點Slashdot.org運行在InnoDB上。 Mytrix, Inc.在InnoDB上存儲超過1TB的數據,還有一些其它站點在InnoDB上處理平均每秒800次插入/更新的負荷。

          給出一個事務控制的例子:

          mysql> CREATE TABLE CUSTOMER (A INT, B CHAR (20), INDEX (A)) ENGINE=InnoDB;
          Query OK, 0 rows affected (0.30 sec)

          mysql> BEGIN;
          Query OK, 0 rows affected (0.00 sec)

          mysql> INSERT INTO CUSTOMER VALUES (10, 'Heikki');
          Query OK, 1 row affected (0.00 sec)

          mysql> COMMIT;
          Query OK, 0 rows affected (0.03 sec)

          mysql> SET AUTOCOMMIT=0;
          Query OK, 0 rows affected (0.00 sec)

          mysql> INSERT INTO CUSTOMER VALUES (15, 'John');
          Query OK, 1 row affected (0.00 sec)

          mysql> ROLLBACK;
          Query OK, 0 rows affected (0.06 sec)

          mysql> SELECT * FROM CUSTOMER;
          +------+--------+
          | A | B |
          +------+--------+
          | 10 | Heikki |
          +------+--------+
          1 row in set (0.00 sec)

              InnoDB存儲引擎相關的內容非常復雜涉及到事物處理、日志、備份和恢復、鎖定、多版本、性能、表和索引的結構、磁盤IO等很多方面的知識。

              我們以上只講述了MYSQL的幾個存儲引擎,使我們能夠對MYSQL的存儲引擎有個基本的認識。MYSQL還提供了BDB (BerkeleyDB)存儲引擎、FEDERATED存儲引擎、ARCHIVE存儲引擎、CSV存儲引擎、BLACKHOLE存儲引擎等,這里就不再詳細說明了。
          posted on 2008-06-12 13:48 lzj520 閱讀(326) 評論(0)  編輯  收藏 所屬分類: mysql
          主站蜘蛛池模板: 额敏县| 颍上县| 瓦房店市| 铜山县| 乌什县| 彩票| 平阳县| 长治市| 尼玛县| 施甸县| 黄石市| 朝阳县| 凤翔县| 海门市| 金平| 南召县| 新竹县| 平乐县| 布尔津县| 茌平县| 冕宁县| 右玉县| 太仓市| 敦煌市| 新疆| 临泉县| 登封市| 阿瓦提县| 临澧县| 汝州市| 确山县| 隆子县| 皋兰县| 新平| 临潭县| 镇雄县| 蒙山县| 枝江市| 浦东新区| 高雄市| 巴中市|