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 閱讀(325)
評論(0) 編輯 收藏 所屬分類:
mysql