From : http://blog.csdn.net/ghosc/article/details/5391544mysql
MySQL做爲當前最爲流行的免費數據庫服務引擎,已經風靡了很長一段時間,不過也許也有人對於MySQL的內部環境不很瞭解,尤爲那些針對併發性處理的機制。今天,咱們先了解一下MySQL中數據表的分類,以及它們的一些簡單性質。
截至目前,MySQL一共向用戶提供了包括DBD、HEAP、ISAM、MERGE、MyIAS、InnoDB以及Gemeni這7種表。其中DBD、InnoDB屬於事務安全類表,而其餘屬於事務非安全類表。sql
DBD
Berkeley DB(DBD)表是支持事務處理的表,由Sleepycat軟件公司開發。它提供MySQL用戶期待已久的功能--事務控制。事務控制在任何數據庫系統中都是一個極有價值的功能,由於它們確保一組命令能成功地執行或回滾。數據庫
HEAP
HEAP表是MySQL中存取數據最快的表。這是由於他們使用存儲在動態內存中的一個散列索引,不過若是MySQL或服務器崩潰,這些內存數據將會丟失。安全
ISAM
ISAM表是早期MySQL版本的缺省表類型,直到MyIASM開發出來。建議不要再使用它。服務器
MERGE
MERGE是一個有趣的新類型,在3.23.25以後出現。一個MERGE表其實是又一個MyISAM表的集合,合併而成的一個表,主要是爲了效率的考慮,由於這樣不只僅能夠提升速度、搜索效率、修復效率並且還節省了磁盤空間。併發
MyIASM
MyIASM基於了IASM代碼,應該能夠說是IASM的衍生品,不過增長了很多有用的擴展。它是MySQL的默認數據 表類型,基於了傳統的ISAM類型,ISAM是Indexed Sequential Access Method(有索引的順序訪問方法)的縮寫,通常來講,它是存儲記錄和文件的標準方法。與其餘存儲引擎比較,MyISAM具備檢查和修復表格的大多數工具。ISAM表格能夠被壓縮,並且它們支持全文搜索,不過它們是事務不安全的,並且也不支持外鍵。若是事務回滾將會形成不徹底回滾,從而不具有原子性。因此假如忽略事務以及訪問併發性的話,而且須要執行大量的SELECT檢索語句的話,MyISAM將是最好的選擇。
MyIASM比較好的緣由:
MyIASM表小於IASM表,因此使用較少資源。
MyIASM表在不一樣的平臺上二進制層可移植。
MyIASM擁有更大的鍵碼尺寸,更大的鍵碼上限。
對於MyISAM存儲引擎來講,它的讀鎖和寫鎖是互斥的,從而讀寫操做是串行的。那麼,一個進程請求某個 MyISAM表的讀鎖,同時另外一個進程也請求同一表的寫鎖,MySQL如何處理呢?答案是寫進程先得到鎖。不只如此,即便讀請求先到鎖等待隊列,寫請求後 到,寫鎖也會插到讀鎖請求以前!這是由於MySQL認爲寫請求通常比讀 請求要重要。這也正是MyISAM表不太適合於有大量更新操做和查詢操做應用的原 因,由於,大量的更新操做會形成查詢操做很難得到讀鎖,從而可能永遠阻塞。這種狀況有時可能會變得很是糟糕!幸虧咱們能夠經過一些設置來調節MyISAM 的調度行爲。經過指定啓動參數low-priority-updates,使MyISAM引擎默認給予讀請求以優先的權利。經過執行命令SET LOW_PRIORITY_UPDATES=1,使該鏈接發出的更新請求優先級下降。經過指定INSERT、UPDATE、DELETE語句的LOW_PRIORITY屬性,下降該語句的優先級。雖然上面3種方法都是要麼更新優先,要麼查詢優先的方法,但仍是能夠用其來解決查詢相對重要的應用(如用戶登陸系統)中,讀鎖等待嚴重的問題。另外,MySQL也提供了一種折中的辦法來調節讀寫衝突,即給系統參數max_write_lock_count設置一個合適的值,當一個表的讀鎖達到這個值後,MySQL就暫時將寫請求的優先級下降,給讀進程必定得到鎖的機會。
上面已經討論了寫優先調度機制帶來的問題和解決辦法。這 裏還要強調一點:一些須要長時間運行的查詢操做,也會使寫進程「餓死」!所以,應用中應儘可能避免出現長時間運行的查詢操做,不要總想用一條SELECT語 句來解決問題,由於這種看似巧妙的SQL語句,每每比較複雜,執行時間較長,在可能的狀況下能夠經過使用中間表等措施對SQL語句作必定的「分解」,使每 一步查詢都能在較短期完成,從而減小鎖衝突。若是複雜查詢不可避免,應儘可能安排在數據庫空閒時段執行,好比一些按期統計能夠安排在夜間執行。工具
InnoDB
InnoDB是MySQL 4.0以後推出的一種比較新的數據表類型,這種類型是事務安全的。它與BDB類型具備相同的特性,它們還支持外鍵。InnoDB表格速度很快具備比BDB還豐富的特性,所以若是須要一個事務安全的存儲引擎,建議使用它。若是你的數據執行大量的INSERT或UPDATE,出於性能方面的考慮,一樣應該使用InnoDB表。對於支持事務的InnoDB類型的表來講,影響速度的主要緣由是AUTOCOMMIT默認設置是打開的,並且程序沒有顯式調用BEGIN 開始事務,致使每插入一條都自動提交,嚴重影響了速度。能夠在執行sql前調用begin,多條sql造成一個事物(即便autocommit打開也能夠),將大大提升性能。性能
查看autocommit:select @@autocommit;spa
設置autocommit:set autocommit=0;.net
Gemeni
Gemeni表,據據說也是在MySQL 4.0以後推出的,不過截至當前,不多有針對它的介紹,一樣應用也就更少了,咱們暫時不做介紹。
MySQL的數據表類型不少,其中比較重要的是MyISAM,InnoDB這兩種。
這兩種類型各有優缺點,須要根據實際狀況選擇適合的,MySQL支持對不一樣的表設置不一樣的類型。下面作個簡單的對比:
MyISAM表類型是一種比較成熟穩定的表類型,可是MyISAM對一些功能不支持。
MyISAM InnoDB
事務 不支持 支持
數據行鎖定 不支持,只有表鎖定 支持
外鍵約束 不支持 支持
表空間大小 相對小 相對大,最大是2倍
全文索引 支持 不支持
GIS數據 支持 不支持
COUNT問題 無 執行COUNT(*)查詢時,速度慢
SQL舉例: 【CREATE TABLE tb_test TYPE=HEAP (name char(10) NOT NULL, numb char(8) NOT NULL, PRIMARY KEY(name))】 --------------------------------------------------------------------------------------------- 1. 能夠執行如下命令來切換非事務表到事務(數據不會丟失),innodb表比myisam表更安全: ALTER TABLE tablename type = INNODB; 2. INNODB表不能用REPAIR TABLE命令和MYISAMCHK -r table_name 但能夠用CHECK TABLE,以及MYSQLCHECK [OPTIONS] database [tables] 3. 啓動mysql數據庫的命令行中添加了如下參數可使新發布的mysql數據表都默認爲使用事務(隻影響到create語句。) –default-table-type = InnoDB 4. 臨時改變默認表類型能夠用: SET table_type = INNODB; SHOW VARIABLES LIKE 'table_type'; 或: c:/mysql/bin/mysqld-max-nt –standalone –default-table-type=InnoDB